crypto: inside-secure - irq balance
[ Upstream commit c6720415907f21b9c53efbe679b96c3cc9d06404 ] Balance the irqs of the inside secure driver over all available cpus. Currently all interrupts are handled by the first CPU. From my testing with IPSec AES-GCM 256 on my MCbin with 4 Cores I get a 50% speed increase: Before the patch: 99.73 Kpps With the patch: 151.25 Kpps Signed-off-by: Sven Auhagen <sven.auhagen@voleatech.de> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Stable-dep-of: ca25c00ccbc5 ("crypto: safexcel - Cleanup ring IRQ workqueues on load failure") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
439d3a7056
commit
b9878f485d
@ -1090,11 +1090,12 @@ static irqreturn_t safexcel_irq_ring_thread(int irq, void *data)
|
|||||||
|
|
||||||
static int safexcel_request_ring_irq(void *pdev, int irqid,
|
static int safexcel_request_ring_irq(void *pdev, int irqid,
|
||||||
int is_pci_dev,
|
int is_pci_dev,
|
||||||
|
int ring_id,
|
||||||
irq_handler_t handler,
|
irq_handler_t handler,
|
||||||
irq_handler_t threaded_handler,
|
irq_handler_t threaded_handler,
|
||||||
struct safexcel_ring_irq_data *ring_irq_priv)
|
struct safexcel_ring_irq_data *ring_irq_priv)
|
||||||
{
|
{
|
||||||
int ret, irq;
|
int ret, irq, cpu;
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_PCI) && is_pci_dev) {
|
if (IS_ENABLED(CONFIG_PCI) && is_pci_dev) {
|
||||||
@ -1132,6 +1133,10 @@ static int safexcel_request_ring_irq(void *pdev, int irqid,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set affinity */
|
||||||
|
cpu = cpumask_local_spread(ring_id, NUMA_NO_NODE);
|
||||||
|
irq_set_affinity_hint(irq, get_cpu_mask(cpu));
|
||||||
|
|
||||||
return irq;
|
return irq;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1482,6 +1487,7 @@ static int safexcel_probe_generic(void *pdev,
|
|||||||
irq = safexcel_request_ring_irq(pdev,
|
irq = safexcel_request_ring_irq(pdev,
|
||||||
EIP197_IRQ_NUMBER(i, is_pci_dev),
|
EIP197_IRQ_NUMBER(i, is_pci_dev),
|
||||||
is_pci_dev,
|
is_pci_dev,
|
||||||
|
i,
|
||||||
safexcel_irq_ring,
|
safexcel_irq_ring,
|
||||||
safexcel_irq_ring_thread,
|
safexcel_irq_ring_thread,
|
||||||
ring_irq);
|
ring_irq);
|
||||||
@ -1490,6 +1496,7 @@ static int safexcel_probe_generic(void *pdev,
|
|||||||
return irq;
|
return irq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
priv->ring[i].irq = irq;
|
||||||
priv->ring[i].work_data.priv = priv;
|
priv->ring[i].work_data.priv = priv;
|
||||||
priv->ring[i].work_data.ring = i;
|
priv->ring[i].work_data.ring = i;
|
||||||
INIT_WORK(&priv->ring[i].work_data.work,
|
INIT_WORK(&priv->ring[i].work_data.work,
|
||||||
@ -1627,8 +1634,10 @@ static int safexcel_remove(struct platform_device *pdev)
|
|||||||
|
|
||||||
clk_disable_unprepare(priv->clk);
|
clk_disable_unprepare(priv->clk);
|
||||||
|
|
||||||
for (i = 0; i < priv->config.rings; i++)
|
for (i = 0; i < priv->config.rings; i++) {
|
||||||
|
irq_set_affinity_hint(priv->ring[i].irq, NULL);
|
||||||
destroy_workqueue(priv->ring[i].workqueue);
|
destroy_workqueue(priv->ring[i].workqueue);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -640,6 +640,9 @@ struct safexcel_ring {
|
|||||||
*/
|
*/
|
||||||
struct crypto_async_request *req;
|
struct crypto_async_request *req;
|
||||||
struct crypto_async_request *backlog;
|
struct crypto_async_request *backlog;
|
||||||
|
|
||||||
|
/* irq of this ring */
|
||||||
|
int irq;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* EIP integration context flags */
|
/* EIP integration context flags */
|
||||||
|
Loading…
Reference in New Issue
Block a user