[PATCH] rdma/core: add __module_get()/module_put() to cma_[de]ref_dev()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Currently there seems to be a problem when an RDMA listener or connection
is active on an ib_device.

'rmmod rdma_rxe' (the same for 'siw' and most likely all
others) just hangs like this until shutdown the listeners and
connections:

  [<0>] remove_client_context+0x97/0xe0 [ib_core]
  [<0>] disable_device+0x90/0x120 [ib_core]
  [<0>] __ib_unregister_device+0x41/0xa0 [ib_core]
  [<0>] ib_unregister_driver+0xbb/0x100 [ib_core]
  [<0>] rxe_module_exit+0x1a/0x8aa [rdma_rxe]
  [<0>] __x64_sys_delete_module+0x147/0x290
  [<0>] do_syscall_64+0x5a/0x130
  [<0>] entry_SYSCALL_64_after_hwframe+0x44/0xa9

The following would be expected:

  rmmod: ERROR: Module rdma_rxe is in use

And this change provides that.

Once all add listeners and connections are gone
the module can be removed again.

Signed-off-by: Stefan Metzmacher <metze@xxxxxxxxx>
Cc: stable@xxxxxxxxxxxxxxx
---
 drivers/infiniband/core/cma.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index a68d0ccf67a4..d10f3d01fa02 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -276,6 +276,7 @@ enum {
 void cma_ref_dev(struct cma_device *cma_dev)
 {
 	atomic_inc(&cma_dev->refcount);
+	__module_get(cma_dev->device->ops.owner);
 }
 
 struct cma_device *cma_enum_devices_by_ibdev(cma_device_filter	filter,
@@ -512,6 +513,7 @@ static void cma_attach_to_dev(struct rdma_id_private *id_priv,
 
 void cma_deref_dev(struct cma_device *cma_dev)
 {
+	module_put(cma_dev->device->ops.owner);
 	if (atomic_dec_and_test(&cma_dev->refcount))
 		complete(&cma_dev->comp);
 }
-- 
2.17.1




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux