net/mlx5: fs, add HWS flow group API functions

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>
This commit is contained in:
Moshe Shemesh 2025-01-09 18:05:34 +02:00 committed by Jakub Kicinski
parent 0f3ecf5c57
commit 4160405f6c
3 changed files with 50 additions and 1 deletions

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

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

View 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);