Skip to content

Commit c672041

Browse files
svenauhagenherbertx
authored andcommitted
crypto: inside-secure - irq balance
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 <[email protected]> Signed-off-by: Herbert Xu <[email protected]>
1 parent 6914dd5 commit c672041

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

drivers/crypto/inside-secure/safexcel.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1135,11 +1135,12 @@ static irqreturn_t safexcel_irq_ring_thread(int irq, void *data)
11351135

11361136
static int safexcel_request_ring_irq(void *pdev, int irqid,
11371137
int is_pci_dev,
1138+
int ring_id,
11381139
irq_handler_t handler,
11391140
irq_handler_t threaded_handler,
11401141
struct safexcel_ring_irq_data *ring_irq_priv)
11411142
{
1142-
int ret, irq;
1143+
int ret, irq, cpu;
11431144
struct device *dev;
11441145

11451146
if (IS_ENABLED(CONFIG_PCI) && is_pci_dev) {
@@ -1177,6 +1178,10 @@ static int safexcel_request_ring_irq(void *pdev, int irqid,
11771178
return ret;
11781179
}
11791180

1181+
/* Set affinity */
1182+
cpu = cpumask_local_spread(ring_id, NUMA_NO_NODE);
1183+
irq_set_affinity_hint(irq, get_cpu_mask(cpu));
1184+
11801185
return irq;
11811186
}
11821187

@@ -1611,6 +1616,7 @@ static int safexcel_probe_generic(void *pdev,
16111616
irq = safexcel_request_ring_irq(pdev,
16121617
EIP197_IRQ_NUMBER(i, is_pci_dev),
16131618
is_pci_dev,
1619+
i,
16141620
safexcel_irq_ring,
16151621
safexcel_irq_ring_thread,
16161622
ring_irq);
@@ -1619,6 +1625,7 @@ static int safexcel_probe_generic(void *pdev,
16191625
return irq;
16201626
}
16211627

1628+
priv->ring[i].irq = irq;
16221629
priv->ring[i].work_data.priv = priv;
16231630
priv->ring[i].work_data.ring = i;
16241631
INIT_WORK(&priv->ring[i].work_data.work,
@@ -1756,8 +1763,10 @@ static int safexcel_remove(struct platform_device *pdev)
17561763
clk_disable_unprepare(priv->reg_clk);
17571764
clk_disable_unprepare(priv->clk);
17581765

1759-
for (i = 0; i < priv->config.rings; i++)
1766+
for (i = 0; i < priv->config.rings; i++) {
1767+
irq_set_affinity_hint(priv->ring[i].irq, NULL);
17601768
destroy_workqueue(priv->ring[i].workqueue);
1769+
}
17611770

17621771
return 0;
17631772
}

drivers/crypto/inside-secure/safexcel.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,9 @@ struct safexcel_ring {
707707
*/
708708
struct crypto_async_request *req;
709709
struct crypto_async_request *backlog;
710+
711+
/* irq of this ring */
712+
int irq;
710713
};
711714

712715
/* EIP integration context flags */

0 commit comments

Comments
 (0)