]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
net/mlx5: fs, add HWS flow group API functions
authorMoshe Shemesh <moshe@nvidia.com>
Thu, 9 Jan 2025 16:05:34 +0000 (18:05 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 14 Jan 2025 03:21:08 +0000 (19:21 -0800)
Add API functions to create and destroy HW Steering flow groups. Each
flow group consists of a Backward Compatible (BWC) HW Steering matcher
which holds the flow group match criteria.

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-4-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/fs_core.h
drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.c
drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.h

index 7fd480a2570dfc894b7689975cb7382a3d34bc23..915cd3277dfbe06b142e368770c8e613d9734b52 100644 (file)
@@ -285,7 +285,10 @@ struct mlx5_flow_group_mask {
 /* Type of children is fs_fte */
 struct mlx5_flow_group {
        struct fs_node                  node;
-       struct mlx5_fs_dr_matcher       fs_dr_matcher;
+       union {
+               struct mlx5_fs_dr_matcher       fs_dr_matcher;
+               struct mlx5_fs_hws_matcher      fs_hws_matcher;
+       };
        struct mlx5_flow_group_mask     mask;
        u32                             start_index;
        u32                             max_ftes;
index 57d88088e18b2edae3f0a10419bad4fafd2c7f0f..f0cbc9996456e1b53983d9c7d519cfaa3cfdd52c 100644 (file)
@@ -153,11 +153,53 @@ static int mlx5_cmd_hws_update_root_ft(struct mlx5_flow_root_namespace *ns,
                                                         disconnect);
 }
 
+static int mlx5_cmd_hws_create_flow_group(struct mlx5_flow_root_namespace *ns,
+                                         struct mlx5_flow_table *ft, u32 *in,
+                                         struct mlx5_flow_group *fg)
+{
+       struct mlx5hws_match_parameters mask;
+       struct mlx5hws_bwc_matcher *matcher;
+       u8 match_criteria_enable;
+       u32 priority;
+
+       if (mlx5_fs_cmd_is_fw_term_table(ft))
+               return mlx5_fs_cmd_get_fw_cmds()->create_flow_group(ns, ft, in, fg);
+
+       mask.match_buf = MLX5_ADDR_OF(create_flow_group_in, in, match_criteria);
+       mask.match_sz = sizeof(fg->mask.match_criteria);
+
+       match_criteria_enable = MLX5_GET(create_flow_group_in, in,
+                                        match_criteria_enable);
+       priority = MLX5_GET(create_flow_group_in, in, start_flow_index);
+       matcher = mlx5hws_bwc_matcher_create(ft->fs_hws_table.hws_table,
+                                            priority, match_criteria_enable,
+                                            &mask);
+       if (!matcher) {
+               mlx5_core_err(ns->dev, "Failed creating matcher\n");
+               return -EINVAL;
+       }
+
+       fg->fs_hws_matcher.matcher = matcher;
+       return 0;
+}
+
+static int mlx5_cmd_hws_destroy_flow_group(struct mlx5_flow_root_namespace *ns,
+                                          struct mlx5_flow_table *ft,
+                                          struct mlx5_flow_group *fg)
+{
+       if (mlx5_fs_cmd_is_fw_term_table(ft))
+               return mlx5_fs_cmd_get_fw_cmds()->destroy_flow_group(ns, ft, fg);
+
+       return mlx5hws_bwc_matcher_destroy(fg->fs_hws_matcher.matcher);
+}
+
 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,
        .modify_flow_table = mlx5_cmd_hws_modify_flow_table,
        .update_root_ft = mlx5_cmd_hws_update_root_ft,
+       .create_flow_group = mlx5_cmd_hws_create_flow_group,
+       .destroy_flow_group = mlx5_cmd_hws_destroy_flow_group,
        .create_ns = mlx5_cmd_hws_create_ns,
        .destroy_ns = mlx5_cmd_hws_destroy_ns,
        .set_peer = mlx5_cmd_hws_set_peer,
index c4af8d617b4d4ccc800579affbad129b8dcb3790..a54b426d99b2d4b5893580c672cc95c2d395b10d 100644 (file)
@@ -15,6 +15,10 @@ struct mlx5_fs_hws_table {
        bool miss_ft_set;
 };
 
+struct mlx5_fs_hws_matcher {
+       struct mlx5hws_bwc_matcher *matcher;
+};
+
 #ifdef CONFIG_MLX5_HW_STEERING
 
 const struct mlx5_flow_cmds *mlx5_fs_cmd_get_hws_cmds(void);