linux_dsm_epyc7002/drivers/infiniband/core
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
..
addr.c RDMA/core: Annotate timeout as unsigned long 2018-10-16 13:34:01 -04:00
agent.c IB/core: Rename ib_destroy_ah to rdma_destroy_ah 2017-05-01 14:32:43 -04:00
agent.h IB/mad: Add final OPA MAD processing 2015-06-12 14:49:18 -04:00
cache.c Merge branch 'for-rc' into rdma.git for-next 2018-10-16 00:01:02 -06:00
cgroup.c IB/core: added support to use rdma cgroup controller 2017-01-10 11:14:27 -05:00
cm_msgs.h IB/cm: Remove unused and erroneous msg sequence encoding 2018-07-09 11:39:28 -06:00
cm.c RDMA/cm: Respect returned status of cm_init_av_by_path 2018-10-16 08:29:24 -06:00
cma_configfs.c RDMA/cma: Move cma module specific functions to cma_priv.h 2018-11-22 11:57:33 -07:00
cma_priv.h RDMA/cma: Move cma module specific functions to cma_priv.h 2018-11-22 11:57:33 -07:00
cma.c RDMA/core: Annotate timeout as unsigned long 2018-10-16 13:34:01 -04:00
core_priv.h RDMA/core: Sync unregistration with netlink commands 2018-11-22 12:39:26 -07:00
cq.c RDMA/restrack: Consolidate task name updates in one place 2018-10-05 16:07:39 -06:00
device.c RDMA/core: Sync unregistration with netlink commands 2018-11-22 12:39:26 -07:00
fmr_pool.c IB/core: Make function ib_fmr_pool_unmap return void 2018-11-21 16:13:02 -07:00
iwcm.c RDMA/core: Use dev_name instead of ibdev->name 2018-09-26 13:51:48 -06:00
iwcm.h iw_cm: free cm_id resources on the last deref 2016-08-02 13:15:18 -04:00
iwpm_msg.c RDMA/iwpm: Properly mark end of NL messages 2017-09-29 11:32:42 -04:00
iwpm_util.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
iwpm_util.h iwpm: crash fix for large connections test 2016-03-16 13:48:32 -04:00
mad_priv.h RDMA/core: Annotate timeout as unsigned long 2018-10-16 13:34:01 -04:00
mad_rmpp.c IB/mad: Change slid in RMPP recv from 16 to 32 bits 2017-08-08 14:47:18 -04:00
mad_rmpp.h
mad.c RDMA/core: Annotate timeout as unsigned long 2018-10-16 13:34:01 -04:00
Makefile IB/uverbs: Remove struct uverbs_root_spec and all supporting code 2018-08-13 09:17:19 -06:00
mr_pool.c IB/core: add a simple MR pool 2016-05-13 13:37:18 -04:00
multicast.c IB: Make ib_init_ah_from_mcmember set sgid_attr 2018-06-25 14:19:56 -06:00
netlink.c RDMA/netlink: Simplify netlink listener existence check 2018-10-03 16:06:07 -06:00
nldev.c RDMA/core: Sync unregistration with netlink commands 2018-11-22 12:39:26 -07:00
opa_smi.h IB: Add rdma_cap_ib_switch helper and use where appropriate 2015-07-14 13:20:08 -04:00
packer.c IB/core: trivial prink cleanup. 2016-03-03 10:20:25 -05:00
rdma_core.c RDMA/uverbs: Get rid of ucontext->tgid 2018-09-21 11:58:36 -04:00
rdma_core.h RDMA/uverbs: Convert the write interface to use uverbs_api 2018-11-22 11:57:33 -07:00
restrack.c RDMA/restrack: Protect from reentry to resource return path 2018-10-16 08:24:36 -06:00
roce_gid_mgmt.c IB/core: Change filter function return type from int to bool 2018-08-15 13:33:20 -06:00
rw.c IB/core: Ensure we map P2P memory correctly in rdma_rw_ctx_[init|destroy]() 2018-10-17 12:18:20 -05:00
sa_query.c RDMA/core: Annotate timeout as unsigned long 2018-10-16 13:34:01 -04:00
sa.h RDMA/core: Annotate timeout as unsigned long 2018-10-16 13:34:01 -04:00
security.c RDMA/core: Use dev_name instead of ibdev->name 2018-09-26 13:51:48 -06:00
smi.c IB: Add rdma_cap_ib_switch helper and use where appropriate 2015-07-14 13:20:08 -04:00
smi.h IB: Add rdma_cap_ib_switch helper and use where appropriate 2015-07-14 13:20:08 -04:00
sysfs.c RDMA/core: Fix comment for hw stats init for port == 0 2018-10-17 11:43:07 -04:00
ucm.c IB/ucm: Fix Spectre v1 vulnerability 2018-10-16 11:32:40 -04:00
ucma.c RDMA/ucma: Fix Spectre v1 vulnerability 2018-10-16 12:47:40 -04:00
ud_header.c IB/core: trivial prink cleanup. 2016-03-03 10:20:25 -05:00
umem_odp.c IB/mlx5: Improve ODP debugging messages 2018-11-12 22:26:02 +02:00
umem.c RDMA/core: Acquire and release mmap_sem on page range 2018-09-27 12:40:20 -06:00
user_mad.c RDMA/umad: Use kernel API to allocate umad indexes 2018-10-16 14:36:21 -04:00
uverbs_cmd.c RDMA/uverbs: Check for NULL driver methods for every write call 2018-11-22 11:57:33 -07:00
uverbs_ioctl.c RDMA/uverbs: Fix RCU annotation for radix slot deference 2018-10-03 16:01:40 -06:00
uverbs_main.c RDMA/uverbs: Convert the write interface to use uverbs_api 2018-11-22 11:57:33 -07:00
uverbs_marshall.c IB/cm: Replace members of sa_path_rec with 'struct sgid_attr *' 2018-06-25 14:19:57 -06:00
uverbs_std_types_counters.c RDMA/uverbs: Require all objects to have a driver destroy function 2018-11-22 11:57:32 -07:00
uverbs_std_types_cq.c RDMA/uverbs: Require all objects to have a driver destroy function 2018-11-22 11:57:32 -07:00
uverbs_std_types_dm.c RDMA/uverbs: Require all objects to have a driver destroy function 2018-11-22 11:57:32 -07:00
uverbs_std_types_flow_action.c RDMA/uverbs: Require all objects to have a driver destroy function 2018-11-22 11:57:32 -07:00
uverbs_std_types_mr.c RDMA/uverbs: Require all objects to have a driver destroy function 2018-11-22 11:57:32 -07:00
uverbs_std_types.c RDMA/uverbs: Require all objects to have a driver destroy function 2018-11-22 11:57:32 -07:00
uverbs_uapi.c RDMA/uverbs: Check for NULL driver methods for every write call 2018-11-22 11:57:33 -07:00
uverbs.h RDMA/uverbs: Make all the method functions in uverbs_cmd static 2018-11-22 11:57:33 -07:00
verbs.c First merge window pull request 2018-10-26 07:38:19 -07:00