linux_dsm_epyc7002/drivers/infiniband/core
Jason Gunthorpe 1f54a26bdb RDMA/ucma: Do not miss ctx destruction steps in some cases
[ Upstream commit 8ae291cc95e49011b736b641b0cfad502b7a1526 ]

The destruction flow is very complicated here because the cm_id can be
destroyed from the event handler at any time if the device is
hot-removed. This leaves behind a partial ctx with no cm_id in the
xarray, and will let user space leak memory.

Make everything consistent in this flow in all places:

 - Return the xarray back to XA_ZERO_ENTRY before beginning any
   destruction. The thread that reaches this first is responsible to
   kfree, everyone else does nothing.

 - Test the xarray during the special hot-removal case to block the
   queue_work, this has much simpler locking and doesn't require a
   'destroying'

 - Fix the ref initialization so that it is only positive if cm_id !=
   NULL, then rely on that to guide the destruction process in all cases.

Now the new ucma_destroy_private_ctx() can be called in all places that
want to free the ctx, including all the error unwinds, and none of the
details are missed.

Fixes: a1d33b70db ("RDMA/ucma: Rework how new connections are passed through event delivery")
Link: https://lore.kernel.org/r/20210105111327.230270-1-leon@kernel.org
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2021-01-27 11:55:05 +01:00
..
addr.c RDMA/addr: Fix race with netevent_callback()/rdma_addr_cancel() 2020-09-30 15:29:05 -03:00
agent.c
agent.h
cache.c RDMA/core: Fix empty gid table for non IB/RoCE devices 2020-12-07 16:32:04 -04:00
cgroup.c
cm_msgs.h
cm_trace.c RDMA/cm: Replace pr_debug() call sites with tracepoints 2020-08-24 19:41:41 -03:00
cm_trace.h RDMA/cm: Add tracepoints to track MAD send operations 2020-08-24 19:41:41 -03:00
cm.c RDMA/cm: Fix an attempt to use non-valid pointer when cleaning timewait 2020-12-09 15:51:35 -04:00
cma_configfs.c RDMA/core: Modify enum ib_gid_type and enum rdma_network_type 2020-10-01 21:20:11 -03:00
cma_priv.h RDMA/ucma: Extend ucma_connect to receive ECE parameters 2020-05-27 16:05:05 -03:00
cma_trace.c
cma_trace.h RDMA/core: Move the rdma_show_ib_cm_event() macro 2020-08-24 16:01:47 -03:00
cma.c RDMA/cma: Don't overwrite sgid_attr after device is released 2020-12-30 11:53:53 +01:00
core_priv.h RDMA/restrack: Improve readability in task name management 2020-09-22 19:47:35 -03:00
counters.c RDMA/restrack: Improve readability in task name management 2020-09-22 19:47:35 -03:00
cq.c RDMA/restrack: Improve readability in task name management 2020-09-22 19:47:35 -03:00
device.c RDMA/core: remove use of dma_virt_ops 2021-01-09 13:46:24 +01:00
ib_core_uverbs.c
iwcm.c RDMA/iwcm: Fix iwcm work deallocation 2020-03-04 14:28:25 -04:00
iwcm.h
iwpm_msg.c
iwpm_util.c
iwpm_util.h
lag.c RDMA/core: Consider flow label when building skb 2020-05-06 16:51:43 -03:00
mad_priv.h IB/mad: Change atomics to refcount API 2020-06-24 16:43:45 -03:00
mad_rmpp.c IB/mad: Delete RMPP_STATE_CANCELING state 2020-06-24 16:43:45 -03:00
mad_rmpp.h
mad.c RDMA 5.9 merge window pull request 2020-08-06 16:43:36 -07:00
Makefile RDMA/cm: Replace pr_debug() call sites with tracepoints 2020-08-24 19:41:41 -03:00
mr_pool.c
multicast.c RDMA: Allow ib_client's to fail when add() is called 2020-05-06 11:57:33 -03:00
netlink.c
nldev.c RDMA/netlink: Remove CAP_NET_RAW check when dump a raw QP 2020-07-29 15:51:19 -03:00
opa_smi.h
packer.c
rdma_core.c RDMA/core: Remove ucontext->closing 2020-09-30 15:27:19 -03:00
rdma_core.h IB/uverbs: Introduce create/destroy QP commands over ioctl 2020-05-21 20:39:36 -03:00
restrack.c RDMA/restrack: Don't treat as an error allocation ID wrapping 2021-01-19 18:27:31 +01:00
restrack.h RDMA/restrack: Improve readability in task name management 2020-09-22 19:47:35 -03:00
roce_gid_mgmt.c net: core: introduce struct netdev_nested_priv for nested interface infrastructure 2020-09-28 15:00:15 -07:00
rw.c RDMA/core: remove use of dma_virt_ops 2021-01-09 13:46:24 +01:00
sa_query.c IB/sa: Resolv use-after-free in ib_nl_make_request() 2020-07-02 16:05:12 -03:00
sa.h
security.c RDMA/core: Ensure security pkey modify is not lost 2020-03-24 19:53:25 -03:00
smi.c
smi.h
sysfs.c RDMA/core: Change rdma_get_gid_attr returned error code 2020-10-01 21:20:11 -03:00
trace.c RDMA/core: Clean up tracepoint headers 2020-07-06 14:54:46 -03:00
ucma.c RDMA/ucma: Do not miss ctx destruction steps in some cases 2021-01-27 11:55:05 +01:00
ud_header.c RDMA/core: Use sizeof_field() helper 2020-05-27 13:46:05 -03:00
umem_odp.c IB/core: Enable ODP sync without faulting 2020-10-01 16:44:05 -03:00
umem.c Merge branch 'dynamic_sg' into rdma.git for-next 2020-10-16 12:40:58 -03:00
user_mad.c RDMA: Allow ib_client's to fail when add() is called 2020-05-06 11:57:33 -03:00
uverbs_cmd.c RDMA/core: Align write and ioctl checks of QP types 2020-09-29 13:11:06 -03:00
uverbs_ioctl.c treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
uverbs_main.c RDMA 5.10 pull request 2020-10-17 11:18:18 -07:00
uverbs_marshall.c
uverbs_std_types_async_fd.c RDMA/uverbs: Move IB_EVENT_DEVICE_FATAL to destroy_uobj 2020-05-12 17:02:25 -03:00
uverbs_std_types_counters.c RDMA: Make counters destroy symmetrical 2020-09-09 14:14:29 -03:00
uverbs_std_types_cq.c RDMA/restrack: Improve readability in task name management 2020-09-22 19:47:35 -03:00
uverbs_std_types_device.c RDMA/uverbs: Fix incorrect variable type 2020-12-30 11:53:47 +01:00
uverbs_std_types_dm.c
uverbs_std_types_flow_action.c
uverbs_std_types_mr.c RDMA/core: Track device memory MRs 2020-12-30 11:53:24 +01:00
uverbs_std_types_qp.c IB/uverbs: Introduce create/destroy QP commands over ioctl 2020-05-21 20:39:36 -03:00
uverbs_std_types_srq.c IB/uverbs: Introduce create/destroy SRQ commands over ioctl 2020-05-21 20:39:35 -03:00
uverbs_std_types_wq.c RDMA: Restore ability to return error for destroy WQ 2020-09-09 14:14:29 -03:00
uverbs_std_types.c RDMA: Convert RWQ table logic to ib_core allocation scheme 2020-09-17 14:04:33 -03:00
uverbs_uapi.c IB/uverbs: Introduce create/destroy QP commands over ioctl 2020-05-21 20:39:36 -03:00
uverbs.h IB/uverbs: Extend CQ to get its own asynchronous event FD 2020-05-21 20:34:53 -03:00
verbs.c RDMA/core: Fix error return in _ib_modify_qp() 2020-12-30 11:52:58 +01:00