Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c438fde1 authored by Artemy Kovalyov's avatar Artemy Kovalyov Committed by David S. Miller
Browse files

IB/mlx5: Add support for big MRs



Make use of extended UMR translation offset.

Signed-off-by: default avatarArtemy Kovalyov <artemyko@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 31616255
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -634,6 +634,7 @@ struct mlx5_ib_dev {
	int				fill_delay;
	int				fill_delay;
#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
	struct ib_odp_caps	odp_caps;
	struct ib_odp_caps	odp_caps;
	u64			odp_max_size;
	/*
	/*
	 * Sleepable RCU that prevents destruction of MRs while they are still
	 * Sleepable RCU that prevents destruction of MRs while they are still
	 * being used by a page fault handler.
	 * being used by a page fault handler.
+5 −3
Original line number Original line Diff line number Diff line
@@ -1121,6 +1121,7 @@ static struct mlx5_ib_mr *reg_create(struct ib_mr *ibmr, struct ib_pd *pd,
		goto err_1;
		goto err_1;
	}
	}
	pas = (__be64 *)MLX5_ADDR_OF(create_mkey_in, in, klm_pas_mtt);
	pas = (__be64 *)MLX5_ADDR_OF(create_mkey_in, in, klm_pas_mtt);
	if (!(access_flags & IB_ACCESS_ON_DEMAND))
		mlx5_ib_populate_pas(dev, umem, page_shift, pas,
		mlx5_ib_populate_pas(dev, umem, page_shift, pas,
				     pg_cap ? MLX5_IB_MTT_PRESENT : 0);
				     pg_cap ? MLX5_IB_MTT_PRESENT : 0);


@@ -1210,7 +1211,8 @@ struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
			mlx5_ib_dbg(dev, "cache empty for order %d", order);
			mlx5_ib_dbg(dev, "cache empty for order %d", order);
			mr = NULL;
			mr = NULL;
		}
		}
	} else if (access_flags & IB_ACCESS_ON_DEMAND) {
	} else if (access_flags & IB_ACCESS_ON_DEMAND &&
		   !MLX5_CAP_GEN(dev->mdev, umr_extended_translation_offset)) {
		err = -EINVAL;
		err = -EINVAL;
		pr_err("Got MR registration for ODP MR > 512MB, not supported for Connect-IB");
		pr_err("Got MR registration for ODP MR > 512MB, not supported for Connect-IB");
		goto error;
		goto error;
+5 −0
Original line number Original line Diff line number Diff line
@@ -121,6 +121,11 @@ void mlx5_ib_internal_fill_odp_caps(struct mlx5_ib_dev *dev)


	caps->general_caps = IB_ODP_SUPPORT;
	caps->general_caps = IB_ODP_SUPPORT;


	if (MLX5_CAP_GEN(dev->mdev, umr_extended_translation_offset))
		dev->odp_max_size = U64_MAX;
	else
		dev->odp_max_size = BIT_ULL(MLX5_MAX_UMR_SHIFT + PAGE_SHIFT);

	if (MLX5_CAP_ODP(dev->mdev, ud_odp_caps.send))
	if (MLX5_CAP_ODP(dev->mdev, ud_odp_caps.send))
		caps->per_transport_caps.ud_odp_caps |= IB_ODP_SUPPORT_SEND;
		caps->per_transport_caps.ud_odp_caps |= IB_ODP_SUPPORT_SEND;