Skip to content

Commit f999f3c

Browse files
u1f35csmb49
authored andcommitted
crypto: safexcel - Cleanup ring IRQ workqueues on load failure
BugLink: https://bugs.launchpad.net/bugs/2025095 commit ca25c00 upstream. A failure loading the safexcel driver results in the following warning on boot, because the IRQ affinity has not been correctly cleaned up. Ensure we clean up the affinity and workqueues on a failure to load the driver. crypto-safexcel: probe of f2800000.crypto failed with error -2 ------------[ cut here ]------------ WARNING: CPU: 1 PID: 232 at kernel/irq/manage.c:1913 free_irq+0x300/0x340 Modules linked in: hwmon mdio_i2c crypto_safexcel(+) md5 sha256_generic libsha256 authenc libdes omap_rng rng_core nft_masq nft_nat nft_chain_nat nf_nat nft_ct nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 nf_tables libcrc32c nfnetlink fuse autofs4 CPU: 1 PID: 232 Comm: systemd-udevd Tainted: G W 6.1.6-00002-g9d4898824677 #3 Hardware name: MikroTik RB5009 (DT) pstate: 600000c5 (nZCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : free_irq+0x300/0x340 lr : free_irq+0x2e0/0x340 sp : ffff800008fa3890 x29: ffff800008fa3890 x28: 0000000000000000 x27: 0000000000000000 x26: ffff8000008e6dc0 x25: ffff000009034cac x24: ffff000009034d50 x23: 0000000000000000 x22: 000000000000004a x21: ffff0000093e0d80 x20: ffff000009034c00 x19: ffff00000615fc00 x18: 0000000000000000 x17: 0000000000000000 x16: 0000000000000000 x15: 000075f5c1584c5e x14: 0000000000000017 x13: 0000000000000000 x12: 0000000000000040 x11: ffff000000579b60 x10: ffff000000579b62 x9 : ffff800008bbe370 x8 : ffff000000579dd0 x7 : 0000000000000000 x6 : ffff000000579e18 x5 : ffff000000579da8 x4 : ffff800008ca0000 x3 : ffff800008ca0188 x2 : 0000000013033204 x1 : ffff000009034c00 x0 : ffff8000087eadf0 Call trace: free_irq+0x300/0x340 devm_irq_release+0x14/0x20 devres_release_all+0xa0/0x100 device_unbind_cleanup+0x14/0x60 really_probe+0x198/0x2d4 __driver_probe_device+0x74/0xdc driver_probe_device+0x3c/0x110 __driver_attach+0x8c/0x190 bus_for_each_dev+0x6c/0xc0 driver_attach+0x20/0x30 bus_add_driver+0x148/0x1fc driver_register+0x74/0x120 __platform_driver_register+0x24/0x30 safexcel_init+0x48/0x1000 [crypto_safexcel] do_one_initcall+0x4c/0x1b0 do_init_module+0x44/0x1cc load_module+0x1724/0x1be4 __do_sys_finit_module+0xbc/0x110 __arm64_sys_finit_module+0x1c/0x24 invoke_syscall+0x44/0x110 el0_svc_common.constprop.0+0xc0/0xe0 do_el0_svc+0x20/0x80 el0_svc+0x14/0x4c el0t_64_sync_handler+0xb0/0xb4 el0t_64_sync+0x148/0x14c ---[ end trace 0000000000000000 ]--- Fixes: 1b44c5a ("inside-secure - add SafeXcel EIP197 crypto engine driver") Signed-off-by: Jonathan McDowell <[email protected]> Cc: [email protected] Signed-off-by: Herbert Xu <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]> Signed-off-by: Kamal Mostafa <[email protected]> Signed-off-by: Roxana Nicolescu <[email protected]>
1 parent dcc9ff8 commit f999f3c

File tree

1 file changed

+27
-10
lines changed

1 file changed

+27
-10
lines changed

drivers/crypto/inside-secure/safexcel.c

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1631,19 +1631,23 @@ static int safexcel_probe_generic(void *pdev,
16311631
&priv->ring[i].rdr);
16321632
if (ret) {
16331633
dev_err(dev, "Failed to initialize rings\n");
1634-
return ret;
1634+
goto err_cleanup_rings;
16351635
}
16361636

16371637
priv->ring[i].rdr_req = devm_kcalloc(dev,
16381638
EIP197_DEFAULT_RING_SIZE,
16391639
sizeof(*priv->ring[i].rdr_req),
16401640
GFP_KERNEL);
1641-
if (!priv->ring[i].rdr_req)
1642-
return -ENOMEM;
1641+
if (!priv->ring[i].rdr_req) {
1642+
ret = -ENOMEM;
1643+
goto err_cleanup_rings;
1644+
}
16431645

16441646
ring_irq = devm_kzalloc(dev, sizeof(*ring_irq), GFP_KERNEL);
1645-
if (!ring_irq)
1646-
return -ENOMEM;
1647+
if (!ring_irq) {
1648+
ret = -ENOMEM;
1649+
goto err_cleanup_rings;
1650+
}
16471651

16481652
ring_irq->priv = priv;
16491653
ring_irq->ring = i;
@@ -1657,7 +1661,8 @@ static int safexcel_probe_generic(void *pdev,
16571661
ring_irq);
16581662
if (irq < 0) {
16591663
dev_err(dev, "Failed to get IRQ ID for ring %d\n", i);
1660-
return irq;
1664+
ret = irq;
1665+
goto err_cleanup_rings;
16611666
}
16621667

16631668
priv->ring[i].irq = irq;
@@ -1669,8 +1674,10 @@ static int safexcel_probe_generic(void *pdev,
16691674
snprintf(wq_name, 9, "wq_ring%d", i);
16701675
priv->ring[i].workqueue =
16711676
create_singlethread_workqueue(wq_name);
1672-
if (!priv->ring[i].workqueue)
1673-
return -ENOMEM;
1677+
if (!priv->ring[i].workqueue) {
1678+
ret = -ENOMEM;
1679+
goto err_cleanup_rings;
1680+
}
16741681

16751682
priv->ring[i].requests = 0;
16761683
priv->ring[i].busy = false;
@@ -1687,16 +1694,26 @@ static int safexcel_probe_generic(void *pdev,
16871694
ret = safexcel_hw_init(priv);
16881695
if (ret) {
16891696
dev_err(dev, "HW init failed (%d)\n", ret);
1690-
return ret;
1697+
goto err_cleanup_rings;
16911698
}
16921699

16931700
ret = safexcel_register_algorithms(priv);
16941701
if (ret) {
16951702
dev_err(dev, "Failed to register algorithms (%d)\n", ret);
1696-
return ret;
1703+
goto err_cleanup_rings;
16971704
}
16981705

16991706
return 0;
1707+
1708+
err_cleanup_rings:
1709+
for (i = 0; i < priv->config.rings; i++) {
1710+
if (priv->ring[i].irq)
1711+
irq_set_affinity_hint(priv->ring[i].irq, NULL);
1712+
if (priv->ring[i].workqueue)
1713+
destroy_workqueue(priv->ring[i].workqueue);
1714+
}
1715+
1716+
return ret;
17001717
}
17011718

17021719
static void safexcel_hw_reset_rings(struct safexcel_crypto_priv *priv)

0 commit comments

Comments
 (0)