linux/drivers/infiniband/hw
Yishai Hadas b13d32786a RDMA/mlx5: Fix a race for an ODP MR which leads to CQE with error
commit abb604a1a9 upstream.

This patch addresses a race condition for an ODP MR that can result in a
CQE with an error on the UMR QP.

During the __mlx5_ib_dereg_mr() flow, the following sequence of calls
occurs:

mlx5_revoke_mr()
 mlx5r_umr_revoke_mr()
 mlx5r_umr_post_send_wait()

At this point, the lkey is freed from the hardware's perspective.

However, concurrently, mlx5_ib_invalidate_range() might be triggered by
another task attempting to invalidate a range for the same freed lkey.

This task will:
 - Acquire the umem_odp->umem_mutex lock.
 - Call mlx5r_umr_update_xlt() on the UMR QP.
 - Since the lkey has already been freed, this can lead to a CQE error,
   causing the UMR QP to enter an error state [1].

To resolve this race condition, the umem_odp->umem_mutex lock is now also
acquired as part of the mlx5_revoke_mr() scope.  Upon successful revoke,
we set umem_odp->private which points to that MR to NULL, preventing any
further invalidation attempts on its lkey.

[1] From dmesg:

   infiniband rocep8s0f0: dump_cqe:277:(pid 0): WC error: 6, Message: memory bind operation error
   cqe_dump: 00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
   cqe_dump: 00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
   cqe_dump: 00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
   cqe_dump: 00000030: 00 00 00 00 08 00 78 06 25 00 11 b9 00 0e dd d2

   WARNING: CPU: 15 PID: 1506 at drivers/infiniband/hw/mlx5/umr.c:394 mlx5r_umr_post_send_wait+0x15a/0x2b0 [mlx5_ib]
   Modules linked in: ip6table_mangle ip6table_natip6table_filter ip6_tables iptable_mangle xt_conntrack xt_MASQUERADE nf_conntrack_netlink nfnetlink xt_addrtype iptable_nat nf_nat br_netfilter rpcsec_gss_krb5 auth_rpcgss oid_registry overlay rpcrdma rdma_ucm ib_iser libiscsi scsi_transport_iscsi rdma_cm iw_cm ib_umad ib_ipoib ib_cm mlx5_ib ib_uverbs ib_core fuse mlx5_core
   CPU: 15 UID: 0 PID: 1506 Comm: ibv_rc_pingpong Not tainted 6.12.0-rc7+ #1626
   Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014
   RIP: 0010:mlx5r_umr_post_send_wait+0x15a/0x2b0 [mlx5_ib]
   [..]
   Call Trace:
   <TASK>
   mlx5r_umr_update_xlt+0x23c/0x3e0 [mlx5_ib]
   mlx5_ib_invalidate_range+0x2e1/0x330 [mlx5_ib]
   __mmu_notifier_invalidate_range_start+0x1e1/0x240
   zap_page_range_single+0xf1/0x1a0
   madvise_vma_behavior+0x677/0x6e0
   do_madvise+0x1a2/0x4b0
   __x64_sys_madvise+0x25/0x30
   do_syscall_64+0x6b/0x140
   entry_SYSCALL_64_after_hwframe+0x76/0x7e

Fixes: e6fb246cca ("RDMA/mlx5: Consolidate MR destruction to mlx5_ib_dereg_mr()")
Cc: stable@vger.kernel.org
Link: https://patch.msgid.link/r/68a1e007c25b2b8fe5d625f238cc3b63e5341f77.1737290229.git.leon@kernel.org
Signed-off-by: Yishai Hadas <yishaih@nvidia.com>
Reviewed-by: Artemy Kovalyov <artemyko@nvidia.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2025-02-17 10:05:44 +01:00
..
bnxt_re RDMA/bnxt_re: Fix to drop reference to the mmap entry in case of error 2025-02-08 09:57:46 +01:00
cxgb4 RDMA/cxgb4: Notify rdma stack for IB_EVENT_QP_LAST_WQE_REACHED event 2025-02-08 09:57:51 +01:00
efa RDMA/efa: Add support for node guid 2024-08-23 11:52:45 -03:00
erdma RDMA/erdma: Return QP state in erdma_query_qp 2024-09-09 21:17:09 +03:00
hfi1 [tree-wide] finally take no_llseek out 2024-09-27 08:18:43 -07:00
hns RDMA/hns: Clean up the legacy CONFIG_INFINIBAND_HNS 2025-02-08 09:57:46 +01:00
irdma RDMA/irdma: Fix misspelling of "accept*" 2024-10-11 14:06:09 -03:00
mana RDMA/mana_ib: use the correct page size for mapping user-mode doorbell page 2024-09-02 10:32:08 +03:00
mlx4 RDMA/mlx4: Avoid false error about access to uninitialized gids array 2025-02-08 09:57:37 +01:00
mlx5 RDMA/mlx5: Fix a race for an ODP MR which leads to CQE with error 2025-02-17 10:05:44 +01:00
mthca RDMA: Pass entire uverbs attr bundle to create cq function 2024-06-27 16:28:21 -03:00
ocrdma RDMA/ocrdma: Don't inline statistics functions 2024-07-11 13:25:11 +03:00
qedr RDMA: Pass entire uverbs attr bundle to create cq function 2024-06-27 16:28:21 -03:00
qib IB/qib: Remove unused declarations in header file 2024-09-10 16:41:03 +03:00
usnic IOMMU Updates for Linux v6.11 2024-07-19 09:59:58 -07:00
vmw_pvrdma RDMA: Pass entire uverbs attr bundle to create cq function 2024-06-27 16:28:21 -03:00
Makefile RDMA/hns: Clean up the legacy CONFIG_INFINIBAND_HNS 2025-02-08 09:57:46 +01:00