]> www.infradead.org Git - users/hch/misc.git/commitdiff
net/mlx5: fs, add HWS to steering mode options
authorMoshe Shemesh <moshe@nvidia.com>
Thu, 9 Jan 2025 16:05:44 +0000 (18:05 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 14 Jan 2025 03:21:09 +0000 (19:21 -0800)
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>
Documentation/networking/devlink/mlx5.rst
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.c
drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.h

index 456985407475f14db69e9abed67d9d943dd31012..41618538fc70c38698a0249f8c99456683cd79f1 100644 (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.
index 41b5e98a04952f7273b1d61b820dab0c0397bf04..f43fd96a680d77d3f8e60f0b91254de547afe6d5 100644 (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)
index ccee230b39920645fae56e45fea7d2054bc40179..05329afeb9ea2b8b50f55acfcdf14487dea3b47e 100644 (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,
index 9e970ac75d2a496e29df7f17a743a254f546ce55..cbddb72d43624967565d4632c3e1ff4787241c07 100644 (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;