Commit 9fc43b5e authored by Moshe Shemesh's avatar Moshe Shemesh Committed by Jakub Kicinski
Browse files

net/mlx5: fs, add HWS to steering mode options



Add HW Steering mode to mlx5 devlink param of steering mode options.

Signed-off-by: default avatarMoshe Shemesh <moshe@nvidia.com>
Reviewed-by: default avatarYevgeny Kliteynik <kliteyn@nvidia.com>
Reviewed-by: default avatarMark Bloch <mbloch@nvidia.com>
Signed-off-by: default avatarTariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/20250109160546.1733647-14-tariqt@nvidia.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent c09cf80e
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -53,6 +53,9 @@ parameters.
       * ``smfs`` Software managed flow steering. In SMFS mode, the HW
         steering entities are created and manage through the driver without
         firmware intervention.
       * ``hmfs`` Hardware managed flow steering. In HMFS mode, the driver
         is configuring steering rules directly to the HW using Work Queues with
         a special new type of WQE (Work Queue Element).

       SMFS mode is faster and provides better rule insertion rate compared to
       default DMFS mode.
+34 −16
Original line number Diff line number Diff line
@@ -3535,35 +3535,42 @@ static int mlx5_fs_mode_validate(struct devlink *devlink, u32 id,
{
	struct mlx5_core_dev *dev = devlink_priv(devlink);
	char *value = val.vstr;
	int err = 0;
	u8 eswitch_mode;

	if (!strcmp(value, "dmfs")) {
	if (!strcmp(value, "dmfs"))
		return 0;
	} else if (!strcmp(value, "smfs")) {
		u8 eswitch_mode;
		bool smfs_cap;

		eswitch_mode = mlx5_eswitch_mode(dev);
		smfs_cap = mlx5_fs_dr_is_supported(dev);
	if (!strcmp(value, "smfs")) {
		bool smfs_cap = mlx5_fs_dr_is_supported(dev);

		if (!smfs_cap) {
			err = -EOPNOTSUPP;
			NL_SET_ERR_MSG_MOD(extack,
					   "Software managed steering is not supported by current device");
			return -EOPNOTSUPP;
		}
	} else if (!strcmp(value, "hmfs")) {
		bool hmfs_cap = mlx5_fs_hws_is_supported(dev);

		else if (eswitch_mode == MLX5_ESWITCH_OFFLOADS) {
		if (!hmfs_cap) {
			NL_SET_ERR_MSG_MOD(extack,
					   "Software managed steering is not supported when eswitch offloads enabled.");
			err = -EOPNOTSUPP;
					   "Hardware steering is not supported by current device");
			return -EOPNOTSUPP;
		}
	} else {
		NL_SET_ERR_MSG_MOD(extack,
				   "Bad parameter: supported values are [\"dmfs\", \"smfs\"]");
		err = -EINVAL;
				   "Bad parameter: supported values are [\"dmfs\", \"smfs\", \"hmfs\"]");
		return -EINVAL;
	}

	return err;
	eswitch_mode = mlx5_eswitch_mode(dev);
	if (eswitch_mode == MLX5_ESWITCH_OFFLOADS) {
		NL_SET_ERR_MSG_FMT_MOD(extack,
				       "Moving to %s is not supported when eswitch offloads enabled.",
				       value);
		return -EOPNOTSUPP;
	}

	return 0;
}

static int mlx5_fs_mode_set(struct devlink *devlink, u32 id,
@@ -3575,6 +3582,8 @@ static int mlx5_fs_mode_set(struct devlink *devlink, u32 id,

	if (!strcmp(ctx->val.vstr, "smfs"))
		mode = MLX5_FLOW_STEERING_MODE_SMFS;
	else if (!strcmp(ctx->val.vstr, "hmfs"))
		mode = MLX5_FLOW_STEERING_MODE_HMFS;
	else
		mode = MLX5_FLOW_STEERING_MODE_DMFS;
	dev->priv.steering->mode = mode;
@@ -3587,10 +3596,17 @@ static int mlx5_fs_mode_get(struct devlink *devlink, u32 id,
{
	struct mlx5_core_dev *dev = devlink_priv(devlink);

	if (dev->priv.steering->mode == MLX5_FLOW_STEERING_MODE_SMFS)
	switch (dev->priv.steering->mode) {
	case MLX5_FLOW_STEERING_MODE_SMFS:
		strscpy(ctx->val.vstr, "smfs", sizeof(ctx->val.vstr));
	else
		break;
	case MLX5_FLOW_STEERING_MODE_HMFS:
		strscpy(ctx->val.vstr, "hmfs", sizeof(ctx->val.vstr));
		break;
	default:
		strscpy(ctx->val.vstr, "dmfs", sizeof(ctx->val.vstr));
	}

	return 0;
}

@@ -4009,6 +4025,8 @@ int mlx5_flow_namespace_set_mode(struct mlx5_flow_namespace *ns,

	if (mode == MLX5_FLOW_STEERING_MODE_SMFS)
		cmds = mlx5_fs_cmd_get_dr_cmds();
	else if (mode == MLX5_FLOW_STEERING_MODE_HMFS)
		cmds = mlx5_fs_cmd_get_hws_cmds();
	else
		cmds = mlx5_fs_cmd_get_fw_cmds();
	if (!cmds)
+5 −0
Original line number Diff line number Diff line
@@ -1344,6 +1344,11 @@ static u32 mlx5_cmd_hws_get_capabilities(struct mlx5_flow_root_namespace *ns,
	       MLX5_FLOW_STEERING_CAP_MATCH_RANGES;
}

bool mlx5_fs_hws_is_supported(struct mlx5_core_dev *dev)
{
	return mlx5hws_is_supported(dev);
}

static const struct mlx5_flow_cmds mlx5_flow_cmds_hws = {
	.create_flow_table = mlx5_cmd_hws_create_flow_table,
	.destroy_flow_table = mlx5_cmd_hws_destroy_flow_table,
+7 −0
Original line number Diff line number Diff line
@@ -60,10 +60,17 @@ struct mlx5_fs_hws_rule {

#ifdef CONFIG_MLX5_HW_STEERING

bool mlx5_fs_hws_is_supported(struct mlx5_core_dev *dev);

const struct mlx5_flow_cmds *mlx5_fs_cmd_get_hws_cmds(void);

#else

static inline bool mlx5_fs_hws_is_supported(struct mlx5_core_dev *dev)
{
	return false;
}

static inline const struct mlx5_flow_cmds *mlx5_fs_cmd_get_hws_cmds(void)
{
	return NULL;