kernel_optimize_test/include/rdma
Parav Pandit 01b671170d RDMA/core: Sync unregistration with netlink commands
When the rdma device is getting removed, get resource info can race with
device removal, as below:

      CPU-0                                  CPU-1
    --------                               --------
    rdma_nl_rcv_msg()
       nldev_res_get_cq_dumpit()
          mutex_lock(device_lock);
          get device reference
          mutex_unlock(device_lock);        [..]
                                            ib_unregister_device()
                                            /* Valid reference to
                                             * device->dev exists.
                                             */
                                             ib_dealloc_device()

          [..]
          provider->fill_res_entry();

Even though device object is not freed, fill_res_entry() can get called on
device which doesn't have a driver anymore. Kernel core device reference
count is not sufficient, as this only keeps the structure valid, and
doesn't guarantee the driver is still loaded.

Similar race can occur with device renaming and device removal, where
device_rename() tries to rename a unregistered device. While this is fine
for devices of a class which are not net namespace aware, but it is
incorrect for net namespace aware class coming in subsequent series.  If a
class is net namespace aware, then the below [1] call trace is observed in
above situation.

Therefore, to avoid the race, keep a reference count and let device
unregistration wait until all netlink users drop the reference.

[1] Call trace:
kernfs: ns required in 'infiniband' for 'mlx5_0'
WARNING: CPU: 18 PID: 44270 at fs/kernfs/dir.c:842 kernfs_find_ns+0x104/0x120
libahci i2c_core mlxfw libata dca [last unloaded: devlink]
RIP: 0010:kernfs_find_ns+0x104/0x120
Call Trace:
kernfs_find_and_get_ns+0x2e/0x50
sysfs_rename_link_ns+0x40/0xb0
device_rename+0xb2/0xf0
ib_device_rename+0xb3/0x100 [ib_core]
nldev_set_doit+0x165/0x190 [ib_core]
rdma_nl_rcv_msg+0x249/0x250 [ib_core]
? netlink_deliver_tap+0x8f/0x3e0
rdma_nl_rcv+0xd6/0x120 [ib_core]
netlink_unicast+0x17c/0x230
netlink_sendmsg+0x2f0/0x3e0
sock_sendmsg+0x30/0x40
__sys_sendto+0xdc/0x160

Fixes: da5c850782 ("RDMA/nldev: add driver-specific resource tracking")
Signed-off-by: Parav Pandit <parav@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
2018-11-22 12:39:26 -07:00
..
ib_addr.h RDMA/core: Annotate timeout as unsigned long 2018-10-16 13:34:01 -04:00
ib_cache.h RDMA/smc: Replace ib_query_gid with rdma_get_gid_attr 2018-08-17 16:45:51 -06:00
ib_cm.h RDMA/core: Annotate timeout as unsigned long 2018-10-16 13:34:01 -04:00
ib_fmr_pool.h IB/core: Make function ib_fmr_pool_unmap return void 2018-11-21 16:13:02 -07:00
ib_hdrs.h
ib_mad.h
ib_marshall.h
ib_pack.h
ib_pma.h
ib_sa.h RDMA/core: Annotate timeout as unsigned long 2018-10-16 13:34:01 -04:00
ib_smi.h
ib_umem_odp.h RDMA/umem: Avoid synchronize_srcu in the ODP MR destruction path 2018-09-21 11:58:36 -04:00
ib_umem.h RDMA/umem: Get rid of struct ib_umem.odp_data 2018-09-21 11:54:46 -04:00
ib_verbs.h RDMA/core: Sync unregistration with netlink commands 2018-11-22 12:39:26 -07:00
ib.h RDMA/core: Return bool instead of int 2018-07-30 20:49:04 -06:00
iw_cm.h
iw_portmap.h
mr_pool.h
opa_addr.h
opa_port_info.h
opa_smi.h
opa_vnic.h
rdma_cm_ib.h
rdma_cm.h RDMA/core: Annotate timeout as unsigned long 2018-10-16 13:34:01 -04:00
rdma_netlink.h RDMA/netlink: Simplify netlink listener existence check 2018-10-03 16:06:07 -06:00
rdma_vt.h IB/{hfi1, qib, rdmavt}: Move send completion logic to rdmavt 2018-10-03 16:38:28 -06:00
rdmavt_cq.h
rdmavt_mr.h
rdmavt_qp.h IB/{hfi1, qib, rdmavt}: Move ruc_loopback to rdmavt 2018-10-03 16:38:28 -06:00
restrack.h RDMA/restrack: Consolidate task name updates in one place 2018-10-05 16:07:39 -06:00
rw.h
uverbs_ioctl.h RDMA/uverbs: Check for NULL driver methods for every write call 2018-11-22 11:57:33 -07:00
uverbs_named_ioctl.h RDMA/uverbs: Use a linear list to describe the compiled-in uapi 2018-11-22 11:57:32 -07:00
uverbs_std_types.h RDMA/uverbs: Use a linear list to describe the compiled-in uapi 2018-11-22 11:57:32 -07:00
uverbs_types.h IB/uverbs: Use uverbs_api to manage the object type inside the uobject 2018-08-10 16:06:24 -06:00