mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-04-13 09:59:31 +00:00
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:
parent
c09cf80ed2
commit
9fc43b5e39
4 changed files with 49 additions and 16 deletions
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue