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

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

Signed-off-by: Moshe Shemesh <moshe@nvidia.com>
Reviewed-by: Yevgeny Kliteynik <kliteyn@nvidia.com>
Reviewed-by: Mark Bloch <mbloch@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/20250109160546.1733647-14-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Moshe Shemesh 2025-01-09 18:05:44 +02:00 committed by Jakub Kicinski
parent c09cf80ed2
commit 9fc43b5e39
4 changed files with 49 additions and 16 deletions

View file

@ -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.

View file

@ -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)

View file

@ -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,

View file

@ -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;