Skip to content

Commit d43b020

Browse files
avihai1122rleon
authored andcommitted
RDMA/mlx5: Check pcie_relaxed_ordering_enabled() in UMR
relaxed_ordering_read HCA capability is set if both the device supports relaxed ordering (RO) read and RO is set in PCI config space. RO in PCI config space can change during runtime. This will change the value of relaxed_ordering_read HCA capability in FW, but the driver will not see it since it queries the capabilities only once. This can lead to the following scenario: 1. RO in PCI config space is enabled. 2. User creates MKey without RO. 3. RO in PCI config space is disabled. As a result, relaxed_ordering_read HCA capability is turned off in FW but remains on in driver copy of the capabilities. 4. User requests to reconfig the MKey with RO via UMR. 5. Driver will try to reconfig the MKey with RO read although it shouldn't (as relaxed_ordering_read HCA capability is really off). To fix this, check pcie_relaxed_ordering_enabled() before setting RO read in UMR. Fixes: 896ec97 ("RDMA/mlx5: Set mkey relaxed ordering by UMR with ConnectX-7") Signed-off-by: Avihai Horon <avihaih@nvidia.com> Reviewed-by: Shay Drory <shayd@nvidia.com> Link: https://lore.kernel.org/r/8d39eb8317e7bed1a354311a20ae707788fd94ed.1681131553.git.leon@kernel.org Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> Signed-off-by: Leon Romanovsky <leon@kernel.org>
1 parent ed4b066 commit d43b020

1 file changed

Lines changed: 4 additions & 2 deletions

File tree

  • drivers/infiniband/hw/mlx5

drivers/infiniband/hw/mlx5/umr.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -380,15 +380,17 @@ static void mlx5r_umr_set_access_flags(struct mlx5_ib_dev *dev,
380380
struct mlx5_mkey_seg *seg,
381381
unsigned int access_flags)
382382
{
383+
bool ro_read = (access_flags & IB_ACCESS_RELAXED_ORDERING) &&
384+
pcie_relaxed_ordering_enabled(dev->mdev->pdev);
385+
383386
MLX5_SET(mkc, seg, a, !!(access_flags & IB_ACCESS_REMOTE_ATOMIC));
384387
MLX5_SET(mkc, seg, rw, !!(access_flags & IB_ACCESS_REMOTE_WRITE));
385388
MLX5_SET(mkc, seg, rr, !!(access_flags & IB_ACCESS_REMOTE_READ));
386389
MLX5_SET(mkc, seg, lw, !!(access_flags & IB_ACCESS_LOCAL_WRITE));
387390
MLX5_SET(mkc, seg, lr, 1);
388391
MLX5_SET(mkc, seg, relaxed_ordering_write,
389392
!!(access_flags & IB_ACCESS_RELAXED_ORDERING));
390-
MLX5_SET(mkc, seg, relaxed_ordering_read,
391-
!!(access_flags & IB_ACCESS_RELAXED_ORDERING));
393+
MLX5_SET(mkc, seg, relaxed_ordering_read, ro_read);
392394
}
393395

394396
int mlx5r_umr_rereg_pd_access(struct mlx5_ib_mr *mr, struct ib_pd *pd,

0 commit comments

Comments
 (0)