Skip to contentSkip to conversation

nvmet-rdma: Fix using unallocated nvmet_rdma_delete_wq

PATCH New Israel Rukshin 4 participants 5 messages Nov 5, 2018 – Nov 11, 2018

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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.

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
index bd265ac..9d75eb6 100644
@@ -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
#1 lore raw

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 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.

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
index bd265ac..9d75eb6 100644
@@ -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);
  }
maintainer
#2 lore raw

PATCH 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..

#3 lore raw

PATCH 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.

#4 lore raw

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 ?