Commit d9e6e85b authored by Yishai Hadas's avatar Yishai Hadas Committed by Jason Gunthorpe
Browse files

RDMA/mlx5: Enable Data-Direct with Relaxed Ordering

Relaxed Ordering can improve performance in certain scenarios.

Enable it in the Data-Direct use case as well.

Link: https://patch.msgid.link/r/1221dcdda8061ba5f6bc3519044083c7438b257e.1755088503.git.leon@kernel.org


Signed-off-by: default avatarYishai Hadas <yishaih@nvidia.com>
Reviewed-by: default avatarGal Shalom <galshalom@Nvidia.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent 8e5442f3
Loading
Loading
Loading
Loading
+30 −2
Original line number Diff line number Diff line
@@ -3118,6 +3118,7 @@ mlx5_ib_create_data_direct_resources(struct mlx5_ib_dev *dev)
{
	int inlen = MLX5_ST_SZ_BYTES(create_mkey_in);
	struct mlx5_core_dev *mdev = dev->mdev;
	bool ro_supp = false;
	void *mkc;
	u32 mkey;
	u32 pdn;
@@ -3146,14 +3147,37 @@ mlx5_ib_create_data_direct_resources(struct mlx5_ib_dev *dev)
	MLX5_SET(mkc, mkc, length64, 1);
	MLX5_SET(mkc, mkc, qpn, 0xffffff);
	err = mlx5_core_create_mkey(mdev, &mkey, in, inlen);
	kvfree(in);
	if (err)
		goto err;
		goto err_mkey;

	dev->ddr.mkey = mkey;
	dev->ddr.pdn = pdn;

	/* create another mkey with RO support */
	if (MLX5_CAP_GEN(dev->mdev, relaxed_ordering_write)) {
		MLX5_SET(mkc, mkc, relaxed_ordering_write, 1);
		ro_supp = true;
	}

	if (MLX5_CAP_GEN(dev->mdev, relaxed_ordering_read)) {
		MLX5_SET(mkc, mkc, relaxed_ordering_read, 1);
		ro_supp = true;
	}

	if (ro_supp) {
		err = mlx5_core_create_mkey(mdev, &mkey, in, inlen);
		/* RO is defined as best effort */
		if (!err) {
			dev->ddr.mkey_ro = mkey;
			dev->ddr.mkey_ro_valid = true;
		}
	}

	kvfree(in);
	return 0;

err_mkey:
	kvfree(in);
err:
	mlx5_core_dealloc_pd(mdev, pdn);
	return err;
@@ -3162,6 +3186,10 @@ mlx5_ib_create_data_direct_resources(struct mlx5_ib_dev *dev)
static void
mlx5_ib_free_data_direct_resources(struct mlx5_ib_dev *dev)
{

	if (dev->ddr.mkey_ro_valid)
		mlx5_core_destroy_mkey(dev->mdev, dev->ddr.mkey_ro);

	mlx5_core_destroy_mkey(dev->mdev, dev->ddr.mkey);
	mlx5_core_dealloc_pd(dev->mdev, dev->ddr.pdn);
}
+2 −0
Original line number Diff line number Diff line
@@ -854,6 +854,8 @@ struct mlx5_ib_port_resources {
struct mlx5_data_direct_resources {
	u32 pdn;
	u32 mkey;
	u32 mkey_ro;
	u8 mkey_ro_valid :1;
};

struct mlx5_ib_resources {
+4 −4
Original line number Diff line number Diff line
@@ -1717,10 +1717,10 @@ reg_user_mr_dmabuf_by_data_direct(struct ib_pd *pd, u64 offset,
		goto end;
	}

	/* The device's 'data direct mkey' was created without RO flags to
	 * simplify things and allow for a single mkey per device.
	 * Since RO is not a must, mask it out accordingly.
	/* If no device's 'data direct mkey' with RO flags exists
	 * mask it out accordingly.
	 */
	if (!dev->ddr.mkey_ro_valid)
		access_flags &= ~IB_ACCESS_RELAXED_ORDERING;
	crossed_mr = reg_user_mr_dmabuf(pd, &data_direct_dev->pdev->dev,
					offset, length, virt_addr, fd,
+5 −1
Original line number Diff line number Diff line
@@ -761,6 +761,10 @@ _mlx5r_umr_update_mr_pas(struct mlx5_ib_mr *mr, unsigned int flags, bool dd,

		if (dd) {
			cur_ksm->va = cpu_to_be64(rdma_block_iter_dma_address(&biter));
			if (mr->access_flags & IB_ACCESS_RELAXED_ORDERING &&
			    dev->ddr.mkey_ro_valid)
				cur_ksm->key = cpu_to_be32(dev->ddr.mkey_ro);
			else
				cur_ksm->key = cpu_to_be32(dev->ddr.mkey);
			if (mr->umem->is_dmabuf &&
			    (flags & MLX5_IB_UPD_XLT_ZAP)) {