Commit 79cdb0aa authored by Paul Blakey's avatar Paul Blakey Committed by Saeed Mahameed

net/mlx5: Allow creating autogroups with reserved entries

Exclude the last n entries for an autogrouped flow table.

Reserving entries at the end of the FT will ensure that this FG will be
the last to be evaluated. This will be used in the next patch to create
a miss group enabling custom actions on FT miss.
Signed-off-by: default avatarPaul Blakey <paulb@mellanox.com>
Reviewed-by: default avatarRoi Dayan <roid@mellanox.com>
Reviewed-by: default avatarOz Shlomo <ozsh@mellanox.com>
Reviewed-by: default avatarMark Bloch <markb@mellanox.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
parent ff189b43
...@@ -579,7 +579,9 @@ static void del_sw_flow_group(struct fs_node *node) ...@@ -579,7 +579,9 @@ static void del_sw_flow_group(struct fs_node *node)
rhashtable_destroy(&fg->ftes_hash); rhashtable_destroy(&fg->ftes_hash);
ida_destroy(&fg->fte_allocator); ida_destroy(&fg->fte_allocator);
if (ft->autogroup.active && fg->max_ftes == ft->autogroup.group_size) if (ft->autogroup.active &&
fg->max_ftes == ft->autogroup.group_size &&
fg->start_index < ft->autogroup.max_fte)
ft->autogroup.num_groups--; ft->autogroup.num_groups--;
err = rhltable_remove(&ft->fgs_hash, err = rhltable_remove(&ft->fgs_hash,
&fg->hash, &fg->hash,
...@@ -1121,9 +1123,14 @@ struct mlx5_flow_table* ...@@ -1121,9 +1123,14 @@ struct mlx5_flow_table*
mlx5_create_auto_grouped_flow_table(struct mlx5_flow_namespace *ns, mlx5_create_auto_grouped_flow_table(struct mlx5_flow_namespace *ns,
struct mlx5_flow_table_attr *ft_attr) struct mlx5_flow_table_attr *ft_attr)
{ {
int num_reserved_entries = ft_attr->autogroup.num_reserved_entries;
int autogroups_max_fte = ft_attr->max_fte - num_reserved_entries;
int max_num_groups = ft_attr->autogroup.max_num_groups;
struct mlx5_flow_table *ft; struct mlx5_flow_table *ft;
if (ft_attr->autogroup.max_num_groups > ft_attr->max_fte) if (max_num_groups > autogroups_max_fte)
return ERR_PTR(-EINVAL);
if (num_reserved_entries > ft_attr->max_fte)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
ft = mlx5_create_flow_table(ns, ft_attr); ft = mlx5_create_flow_table(ns, ft_attr);
...@@ -1131,10 +1138,10 @@ mlx5_create_auto_grouped_flow_table(struct mlx5_flow_namespace *ns, ...@@ -1131,10 +1138,10 @@ mlx5_create_auto_grouped_flow_table(struct mlx5_flow_namespace *ns,
return ft; return ft;
ft->autogroup.active = true; ft->autogroup.active = true;
ft->autogroup.required_groups = ft_attr->autogroup.max_num_groups; ft->autogroup.required_groups = max_num_groups;
ft->autogroup.max_fte = autogroups_max_fte;
/* We save place for flow groups in addition to max types */ /* We save place for flow groups in addition to max types */
ft->autogroup.group_size = ft->max_fte / ft->autogroup.group_size = autogroups_max_fte / (max_num_groups + 1);
(ft->autogroup.required_groups + 1);
return ft; return ft;
} }
...@@ -1156,7 +1163,7 @@ struct mlx5_flow_group *mlx5_create_flow_group(struct mlx5_flow_table *ft, ...@@ -1156,7 +1163,7 @@ struct mlx5_flow_group *mlx5_create_flow_group(struct mlx5_flow_table *ft,
struct mlx5_flow_group *fg; struct mlx5_flow_group *fg;
int err; int err;
if (ft->autogroup.active) if (ft->autogroup.active && start_index < ft->autogroup.max_fte)
return ERR_PTR(-EPERM); return ERR_PTR(-EPERM);
down_write_ref_node(&ft->node, false); down_write_ref_node(&ft->node, false);
...@@ -1329,9 +1336,10 @@ static struct mlx5_flow_group *alloc_auto_flow_group(struct mlx5_flow_table *ft ...@@ -1329,9 +1336,10 @@ static struct mlx5_flow_group *alloc_auto_flow_group(struct mlx5_flow_table *ft
const struct mlx5_flow_spec *spec) const struct mlx5_flow_spec *spec)
{ {
struct list_head *prev = &ft->node.children; struct list_head *prev = &ft->node.children;
struct mlx5_flow_group *fg; u32 max_fte = ft->autogroup.max_fte;
unsigned int candidate_index = 0; unsigned int candidate_index = 0;
unsigned int group_size = 0; unsigned int group_size = 0;
struct mlx5_flow_group *fg;
if (!ft->autogroup.active) if (!ft->autogroup.active)
return ERR_PTR(-ENOENT); return ERR_PTR(-ENOENT);
...@@ -1339,7 +1347,7 @@ static struct mlx5_flow_group *alloc_auto_flow_group(struct mlx5_flow_table *ft ...@@ -1339,7 +1347,7 @@ static struct mlx5_flow_group *alloc_auto_flow_group(struct mlx5_flow_table *ft
if (ft->autogroup.num_groups < ft->autogroup.required_groups) if (ft->autogroup.num_groups < ft->autogroup.required_groups)
group_size = ft->autogroup.group_size; group_size = ft->autogroup.group_size;
/* ft->max_fte == ft->autogroup.max_types */ /* max_fte == ft->autogroup.max_types */
if (group_size == 0) if (group_size == 0)
group_size = 1; group_size = 1;
...@@ -1352,7 +1360,7 @@ static struct mlx5_flow_group *alloc_auto_flow_group(struct mlx5_flow_table *ft ...@@ -1352,7 +1360,7 @@ static struct mlx5_flow_group *alloc_auto_flow_group(struct mlx5_flow_table *ft
prev = &fg->node.list; prev = &fg->node.list;
} }
if (candidate_index + group_size > ft->max_fte) if (candidate_index + group_size > max_fte)
return ERR_PTR(-ENOSPC); return ERR_PTR(-ENOSPC);
fg = alloc_insert_flow_group(ft, fg = alloc_insert_flow_group(ft,
......
...@@ -164,6 +164,7 @@ struct mlx5_flow_table { ...@@ -164,6 +164,7 @@ struct mlx5_flow_table {
unsigned int required_groups; unsigned int required_groups;
unsigned int group_size; unsigned int group_size;
unsigned int num_groups; unsigned int num_groups;
unsigned int max_fte;
} autogroup; } autogroup;
/* Protect fwd_rules */ /* Protect fwd_rules */
struct mutex lock; struct mutex lock;
......
...@@ -155,6 +155,7 @@ struct mlx5_flow_table_attr { ...@@ -155,6 +155,7 @@ struct mlx5_flow_table_attr {
struct { struct {
int max_num_groups; int max_num_groups;
int num_reserved_entries;
} autogroup; } autogroup;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment