nvmet-rdma: Fix using unallocated nvmet_rdma_delete_wq
Subsystems (2)
PATCH 1/1 nvmet-rdma: Fix using unallocated nvmet_rdma_delete_wq
nvmet_rdma_ib_client .remove callback is using nvmet_rdma_delete_wq. Therefore nvmet_rdma_delete_wq must be destroyed only after calling to ib_unregister_client().
The bug may happens when unloading the module with open connections.
--- drivers/nvme/target/rdma.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-)
drivers/nvme/target/rdma.c +9 -11
@@ -1642,35 +1642,33 @@ static int __init nvmet_rdma_init(void) {int ret; + nvmet_rdma_delete_wq =alloc_workqueue ("nvmet-rdma-delete-wq" , +WQ_UNBOUND |WQ_MEM_RECLAIM |WQ_SYSFS ,0 ); +if (!nvmet_rdma_delete_wq) +return -ENOMEM ; + ret =ib_register_client (&nvmet_rdma_ib_client);if (ret) -return ret; + goto err_destroy_workqueue; ret =nvmet_register_transport (&nvmet_rdma_ops);if (ret) goto err_ib_client; - nvmet_rdma_delete_wq =alloc_workqueue ("nvmet-rdma-delete-wq" , -WQ_UNBOUND |WQ_MEM_RECLAIM |WQ_SYSFS ,0 ); -if (!nvmet_rdma_delete_wq) { - ret = -ENOMEM ; - goto err_unreg_transport; - } -return 0 ; -err_unreg_transport: -nvmet_unregister_transport (&nvmet_rdma_ops); err_ib_client:ib_unregister_client (&nvmet_rdma_ib_client); +err_destroy_workqueue: +destroy_workqueue (nvmet_rdma_delete_wq);return ret; } static void __exit nvmet_rdma_exit(void) { -destroy_workqueue (nvmet_rdma_delete_wq);nvmet_unregister_transport (&nvmet_rdma_ops);ib_unregister_client (&nvmet_rdma_ib_client); +destroy_workqueue (nvmet_rdma_delete_wq);WARN_ON_ONCE (!list_empty (&nvmet_rdma_queue_list));ida_destroy (&nvmet_rdma_queue_ida); }
Signature · 1 line
1.8.3.1
PATCH 1/1 nvmet-rdma: Fix using unallocated nvmet_rdma_delete_wq
Sagi/Christoph/Keith,
please note that the problematic commit? "nvmet-rdma: use a private workqueue for delete" is only merged to nvme-4.20 so this fix can be squashed to it IMO.
-Max.
Quoted 61 lines · Israel Rukshin
nvmet_rdma_ib_client.remove callback is usingnvmet_rdma_delete_wq. Thereforenvmet_rdma_delete_wqmust be destroyed only after calling toib_unregister_client().
The bug may happens when unloading the module with open connections.Fixes 2acf70a ("nvmet-rdma: use a private workqueue for delete")Signed-off-by Israel Rukshin <israelr at mellanox.com>Reviewed-by Max Gurtovoy <maxg at mellanox.com>--- drivers/nvme/target/rdma.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-)drivers/nvme/target/rdma.c +9
-11@@ -1642,35 +1642,33 @@ static int __init nvmet_rdma_init(void) {int ret; + nvmet_rdma_delete_wq =alloc_workqueue ("nvmet-rdma-delete-wq" , +WQ_UNBOUND |WQ_MEM_RECLAIM |WQ_SYSFS ,0 ); +if (!nvmet_rdma_delete_wq) +return -ENOMEM ; + ret =ib_register_client (&nvmet_rdma_ib_client);if (ret) -return ret; + goto err_destroy_workqueue; ret =nvmet_register_transport (&nvmet_rdma_ops);if (ret) goto err_ib_client; - nvmet_rdma_delete_wq =alloc_workqueue ("nvmet-rdma-delete-wq" , -WQ_UNBOUND |WQ_MEM_RECLAIM |WQ_SYSFS ,0 ); -if (!nvmet_rdma_delete_wq) { - ret = -ENOMEM ; - goto err_unreg_transport; - } -return 0 ; -err_unreg_transport: -nvmet_unregister_transport (&nvmet_rdma_ops); err_ib_client:ib_unregister_client (&nvmet_rdma_ib_client); +err_destroy_workqueue: +destroy_workqueue (nvmet_rdma_delete_wq);return ret; } static void __exit nvmet_rdma_exit(void) { -destroy_workqueue (nvmet_rdma_delete_wq);nvmet_unregister_transport (&nvmet_rdma_ops);ib_unregister_client (&nvmet_rdma_ib_client); +destroy_workqueue (nvmet_rdma_delete_wq);WARN_ON_ONCE (!list_empty (&nvmet_rdma_queue_list));ida_destroy (&nvmet_rdma_queue_ida); }
Sagi Grimberg
maintainerPATCH 1/1 nvmet-rdma: Fix using unallocated nvmet_rdma_delete_wq
Quoted 6 lines
Sagi/Christoph/Keith,
please note that the problematic commit? "nvmet-rdma: use a private workqueue for delete" is only merged to nvme-4.20 so this fix can be squashed to it IMO.
I think we need to revert 2acf70a ("nvmet-rdma: use a private workqueue for delete") altogether because it never made any difference..
Christoph Hellwig
maintainerPATCH 1/1 nvmet-rdma: Fix using unallocated nvmet_rdma_delete_wq
Quoted 9 lines · Sagi Grimberg
Quoted 6 lines
Sagi/Christoph/Keith,
please note that the problematic commit? "nvmet-rdma: use a private workqueue for delete" is only merged to nvme-4.20 so this fix can be squashed to it IMO.
I think we need to revert 2acf70a ("nvmet-rdma: use a private workqueue for delete") altogether because it never made any difference..
Agreed. And nvme-4.20 has been merged to mainline already, so we can't squash anything. I'll plan to revert it for now.
PATCH 1/1 nvmet-rdma: Fix using unallocated nvmet_rdma_delete_wq
Quoted 10 lines · Christoph Hellwig
Quoted 7 lines · Sagi Grimberg
Quoted 5 lines
Sagi/Christoph/Keith,
please note that the problematic commit? "nvmet-rdma: use a private workqueue for delete" is only merged to nvme-4.20 so this fix can be squashed to it IMO.
I think we need to revert 2acf70a ("nvmet-rdma: use a private workqueue for delete") altogether because it never made any difference..
Agreed. And nvme-4.20 has been merged to mainline already, so we can't squash anything. I'll plan to revert it for now.
so how we overcome the circular lock that was reported by Bart ?