RDMA/core: Remove context entries from list while unregistering device
authorParav Pandit <parav@mellanox.com>
Tue, 28 Aug 2018 12:08:43 +0000 (15:08 +0300)
committerJason Gunthorpe <jgg@mellanox.com>
Thu, 6 Sep 2018 19:45:38 +0000 (13:45 -0600)
While unregistering a device, remove the context elements from the list to
not have any stale entries. With that any errors/bugs can be checked when
device is freed.

Signed-off-by: Parav Pandit <parav@mellanox.com>
Reviewed-by: Daniel Jurgens <danielj@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/core/device.c

index 559fbe6..8175847 100644 (file)
@@ -286,6 +286,7 @@ EXPORT_SYMBOL(ib_alloc_device);
  */
 void ib_dealloc_device(struct ib_device *device)
 {
+       WARN_ON(!list_empty(&device->client_data_list));
        WARN_ON(device->reg_state != IB_DEV_UNREGISTERED &&
                device->reg_state != IB_DEV_UNINITIALIZED);
        rdma_restrack_clean(&device->res);
@@ -610,8 +611,11 @@ void ib_unregister_device(struct ib_device *device)
 
        down_write(&lists_rwsem);
        spin_lock_irqsave(&device->client_data_lock, flags);
-       list_for_each_entry_safe(context, tmp, &device->client_data_list, list)
+       list_for_each_entry_safe(context, tmp, &device->client_data_list,
+                                list) {
+               list_del(&context->list);
                kfree(context);
+       }
        spin_unlock_irqrestore(&device->client_data_lock, flags);
        up_write(&lists_rwsem);