Skip to content

Commit

Permalink
net/mlx5: Handle memory scheme ODP capabilities
Browse files Browse the repository at this point in the history
When running over new FW that supports the new memory scheme ODP, set
the cap in the FW to signal the FW we are working in the new scheme.

In the memory scheme ODP the per_transport_service capabilities are RO
for the driver so we skip their setting.

Signed-off-by: Michael Guralnik <michaelgur@nvidia.com>
Link: https://patch.msgid.link/20240909100504.29797-9-michaelgur@nvidia.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
  • Loading branch information
Michael Guralnik authored and Leon Romanovsky committed Sep 13, 2024
1 parent 6f2487b commit 907936b
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 7 deletions.
22 changes: 18 additions & 4 deletions drivers/net/ethernet/mellanox/mlx5/core/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -454,8 +454,8 @@ static int handle_hca_cap_atomic(struct mlx5_core_dev *dev, void *set_ctx)

static int handle_hca_cap_odp(struct mlx5_core_dev *dev, void *set_ctx)
{
bool do_set = false, mem_page_fault = false;
void *set_hca_cap;
bool do_set = false;
int err;

if (!IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING) ||
Expand All @@ -470,6 +470,17 @@ static int handle_hca_cap_odp(struct mlx5_core_dev *dev, void *set_ctx)
memcpy(set_hca_cap, dev->caps.hca[MLX5_CAP_ODP]->cur,
MLX5_ST_SZ_BYTES(odp_cap));

/* For best performance, enable memory scheme ODP only when
* it has page prefetch enabled.
*/
if (MLX5_CAP_ODP_MAX(dev, mem_page_fault) &&
MLX5_CAP_ODP_MAX(dev, memory_page_fault_scheme_cap.page_prefetch)) {
mem_page_fault = true;
do_set = true;
MLX5_SET(odp_cap, set_hca_cap, mem_page_fault, mem_page_fault);
goto set;
}

#define ODP_CAP_SET_MAX(dev, field) \
do { \
u32 _res = MLX5_CAP_ODP_MAX(dev, field); \
Expand All @@ -494,10 +505,13 @@ static int handle_hca_cap_odp(struct mlx5_core_dev *dev, void *set_ctx)
ODP_CAP_SET_MAX(dev, transport_page_fault_scheme_cap.dc_odp_caps.read);
ODP_CAP_SET_MAX(dev, transport_page_fault_scheme_cap.dc_odp_caps.atomic);

if (!do_set)
return 0;
set:
if (do_set)
err = set_caps(dev, set_ctx, MLX5_SET_HCA_CAP_OP_MOD_ODP);

return set_caps(dev, set_ctx, MLX5_SET_HCA_CAP_OP_MOD_ODP);
mlx5_core_dbg(dev, "Using ODP %s scheme\n",
mem_page_fault ? "memory" : "transport");
return err;
}

static int max_uc_list_get_devlink_param(struct mlx5_core_dev *dev)
Expand Down
10 changes: 7 additions & 3 deletions include/linux/mlx5/device.h
Original file line number Diff line number Diff line change
Expand Up @@ -1389,9 +1389,13 @@ enum mlx5_qcam_feature_groups {
#define MLX5_CAP_ODP(mdev, cap)\
MLX5_GET(odp_cap, mdev->caps.hca[MLX5_CAP_ODP]->cur, cap)

#define MLX5_CAP_ODP_SCHEME(mdev, cap) \
MLX5_GET(odp_cap, mdev->caps.hca[MLX5_CAP_ODP]->cur, \
transport_page_fault_scheme_cap.cap)
#define MLX5_CAP_ODP_SCHEME(mdev, cap) \
(MLX5_GET(odp_cap, mdev->caps.hca[MLX5_CAP_ODP]->cur, \
mem_page_fault) ? \
MLX5_GET(odp_cap, mdev->caps.hca[MLX5_CAP_ODP]->cur, \
memory_page_fault_scheme_cap.cap) : \
MLX5_GET(odp_cap, mdev->caps.hca[MLX5_CAP_ODP]->cur, \
transport_page_fault_scheme_cap.cap))

#define MLX5_CAP_ODP_MAX(mdev, cap)\
MLX5_GET(odp_cap, mdev->caps.hca[MLX5_CAP_ODP]->max, cap)
Expand Down

0 comments on commit 907936b

Please sign in to comment.