Skip to content

Commit bd4ba60

Browse files
avihai1122rleon
authored andcommitted
RDMA/mlx5: Allow relaxed ordering read in VFs and VMs
According to PCIe spec, Enable Relaxed Ordering value in the VF's PCI config space is wired to 0 and PF relaxed ordering (RO) setting should be applied to the VF. In QEMU (and maybe others), when assigning VFs, the RO bit in PCI config space is not emulated properly and is always set to 0. Therefore, pcie_relaxed_ordering_enabled() always returns 0 for VFs and VMs and thus MKeys can't be created with RO read even if the PF supports it. pcie_relaxed_ordering_enabled() check was added to avoid a syndrome when creating a MKey with relaxed ordering (RO) enabled when the driver's relaxed_ordering_read_pci_enabled HCA capability is out of sync with FW. With the new relaxed_ordering_read capability this can't happen, as it's set regardless of RO value in PCI config space and thus can't change during runtime. Hence, to allow RO read in VFs and VMs, use the new HCA capability relaxed_ordering_read without checking pcie_relaxed_ordering_enabled(). The old capability checks are kept for backward compatibility with older FWs. Allowing RO in VFs and VMs is valuable since it can greatly improve performance on some setups. For example, testing throughput of a VF on an AMD EPYC 7763 and ConnectX-6 Dx setup showed roughly 60% performance improvement. Signed-off-by: Avihai Horon <avihaih@nvidia.com> Reviewed-by: Shay Drory <shayd@nvidia.com> Reviewed-by: Aya Levin <ayal@nvidia.com> Link: https://lore.kernel.org/r/e7048640d66c341a8fa0465e099926e7989184bc.1681131553.git.leon@kernel.org Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> Signed-off-by: Leon Romanovsky <leon@kernel.org>
1 parent ccbbfe0 commit bd4ba60

4 files changed

Lines changed: 15 additions & 9 deletions

File tree

drivers/infiniband/hw/mlx5/mr.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,11 @@ static void set_mkc_access_pd_addr_fields(void *mkc, int acc, u64 start_addr,
7070
if (acc & IB_ACCESS_RELAXED_ORDERING) {
7171
if (MLX5_CAP_GEN(dev->mdev, relaxed_ordering_write))
7272
MLX5_SET(mkc, mkc, relaxed_ordering_write, 1);
73-
if (MLX5_CAP_GEN(dev->mdev,
74-
relaxed_ordering_read_pci_enabled) &&
75-
pcie_relaxed_ordering_enabled(dev->mdev->pdev))
73+
74+
if (MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read) ||
75+
(MLX5_CAP_GEN(dev->mdev,
76+
relaxed_ordering_read_pci_enabled) &&
77+
pcie_relaxed_ordering_enabled(dev->mdev->pdev)))
7678
MLX5_SET(mkc, mkc, relaxed_ordering_read, 1);
7779
}
7880

@@ -792,7 +794,8 @@ static int get_unchangeable_access_flags(struct mlx5_ib_dev *dev,
792794
ret |= IB_ACCESS_RELAXED_ORDERING;
793795

794796
if ((access_flags & IB_ACCESS_RELAXED_ORDERING) &&
795-
MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read_pci_enabled) &&
797+
(MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read) ||
798+
MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read_pci_enabled)) &&
796799
!MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read_umr))
797800
ret |= IB_ACCESS_RELAXED_ORDERING;
798801

drivers/infiniband/hw/mlx5/umr.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,8 @@ static void mlx5r_umr_set_access_flags(struct mlx5_ib_dev *dev,
381381
unsigned int access_flags)
382382
{
383383
bool ro_read = (access_flags & IB_ACCESS_RELAXED_ORDERING) &&
384-
pcie_relaxed_ordering_enabled(dev->mdev->pdev);
384+
(MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read) ||
385+
pcie_relaxed_ordering_enabled(dev->mdev->pdev));
385386

386387
MLX5_SET(mkc, seg, a, !!(access_flags & IB_ACCESS_REMOTE_ATOMIC));
387388
MLX5_SET(mkc, seg, rw, !!(access_flags & IB_ACCESS_REMOTE_WRITE));

drivers/infiniband/hw/mlx5/umr.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ static inline bool mlx5r_umr_can_reconfig(struct mlx5_ib_dev *dev,
6262
return false;
6363

6464
if ((diffs & IB_ACCESS_RELAXED_ORDERING) &&
65-
MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read_pci_enabled) &&
65+
(MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read) ||
66+
MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read_pci_enabled)) &&
6667
!MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read_umr))
6768
return false;
6869

drivers/net/ethernet/mellanox/mlx5/core/en_common.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,12 @@
3939

4040
void mlx5e_mkey_set_relaxed_ordering(struct mlx5_core_dev *mdev, void *mkc)
4141
{
42-
bool ro_pci_enable = pcie_relaxed_ordering_enabled(mdev->pdev);
4342
bool ro_write = MLX5_CAP_GEN(mdev, relaxed_ordering_write);
44-
bool ro_read = MLX5_CAP_GEN(mdev, relaxed_ordering_read_pci_enabled);
43+
bool ro_read = MLX5_CAP_GEN(mdev, relaxed_ordering_read) ||
44+
(pcie_relaxed_ordering_enabled(mdev->pdev) &&
45+
MLX5_CAP_GEN(mdev, relaxed_ordering_read_pci_enabled));
4546

46-
MLX5_SET(mkc, mkc, relaxed_ordering_read, ro_pci_enable && ro_read);
47+
MLX5_SET(mkc, mkc, relaxed_ordering_read, ro_read);
4748
MLX5_SET(mkc, mkc, relaxed_ordering_write, ro_write);
4849
}
4950

0 commit comments

Comments
 (0)