You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
5.7 KiB
160 lines
5.7 KiB
4 years ago
|
From be97eb6496043414729200bb083deda814c7d33d Mon Sep 17 00:00:00 2001
|
||
|
From: Alaa Hleihel <ahleihel@redhat.com>
|
||
|
Date: Tue, 12 May 2020 10:54:04 -0400
|
||
|
Subject: [PATCH 144/312] [netdrv] net/mlx5: Allow creating autogroups with
|
||
|
reserved entries
|
||
|
|
||
|
Message-id: <20200512105530.4207-39-ahleihel@redhat.com>
|
||
|
Patchwork-id: 306911
|
||
|
Patchwork-instance: patchwork
|
||
|
O-Subject: [RHEL8.3 BZ 1789382 038/124] net/mlx5: Allow creating autogroups with reserved entries
|
||
|
Bugzilla: 1789382
|
||
|
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
|
||
|
RH-Acked-by: Kamal Heib <kheib@redhat.com>
|
||
|
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
|
||
|
|
||
|
Bugzilla: http://bugzilla.redhat.com/1789382
|
||
|
Upstream: v5.6-rc1
|
||
|
|
||
|
commit 79cdb0aaea8b5478db34afa1d4d5ecc808689a67
|
||
|
Author: Paul Blakey <paulb@mellanox.com>
|
||
|
Date: Thu Nov 14 17:02:59 2019 +0200
|
||
|
|
||
|
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: Paul Blakey <paulb@mellanox.com>
|
||
|
Reviewed-by: Roi Dayan <roid@mellanox.com>
|
||
|
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
|
||
|
Reviewed-by: Mark Bloch <markb@mellanox.com>
|
||
|
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
|
||
|
|
||
|
Signed-off-by: Alaa Hleihel <ahleihel@redhat.com>
|
||
|
Signed-off-by: Frantisek Hrbata <fhrbata@redhat.com>
|
||
|
---
|
||
|
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 26 +++++++++++++++--------
|
||
|
drivers/net/ethernet/mellanox/mlx5/core/fs_core.h | 3 +++
|
||
|
include/linux/mlx5/fs.h | 3 +++
|
||
|
3 files changed, 23 insertions(+), 9 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
|
||
|
index 2f6c8890f25e..4c7c707f9e2d 100644
|
||
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
|
||
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
|
||
|
@@ -579,7 +579,9 @@ static void del_sw_flow_group(struct fs_node *node)
|
||
|
|
||
|
rhashtable_destroy(&fg->ftes_hash);
|
||
|
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--;
|
||
|
err = rhltable_remove(&ft->fgs_hash,
|
||
|
&fg->hash,
|
||
|
@@ -1121,9 +1123,14 @@ struct mlx5_flow_table*
|
||
|
mlx5_create_auto_grouped_flow_table_attr_(struct mlx5_flow_namespace *ns,
|
||
|
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;
|
||
|
|
||
|
- 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);
|
||
|
|
||
|
ft = mlx5_create_flow_table(ns, ft_attr);
|
||
|
@@ -1131,10 +1138,10 @@ mlx5_create_auto_grouped_flow_table_attr_(struct mlx5_flow_namespace *ns,
|
||
|
return ft;
|
||
|
|
||
|
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 */
|
||
|
- ft->autogroup.group_size = ft->max_fte /
|
||
|
- (ft->autogroup.required_groups + 1);
|
||
|
+ ft->autogroup.group_size = autogroups_max_fte / (max_num_groups + 1);
|
||
|
|
||
|
return ft;
|
||
|
}
|
||
|
@@ -1175,7 +1182,7 @@ struct mlx5_flow_group *mlx5_create_flow_group(struct mlx5_flow_table *ft,
|
||
|
struct mlx5_flow_group *fg;
|
||
|
int err;
|
||
|
|
||
|
- if (ft->autogroup.active)
|
||
|
+ if (ft->autogroup.active && start_index < ft->autogroup.max_fte)
|
||
|
return ERR_PTR(-EPERM);
|
||
|
|
||
|
down_write_ref_node(&ft->node, false);
|
||
|
@@ -1348,9 +1355,10 @@ static struct mlx5_flow_group *alloc_auto_flow_group(struct mlx5_flow_table *ft
|
||
|
const struct mlx5_flow_spec *spec)
|
||
|
{
|
||
|
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 group_size = 0;
|
||
|
+ struct mlx5_flow_group *fg;
|
||
|
|
||
|
if (!ft->autogroup.active)
|
||
|
return ERR_PTR(-ENOENT);
|
||
|
@@ -1358,7 +1366,7 @@ static struct mlx5_flow_group *alloc_auto_flow_group(struct mlx5_flow_table *ft
|
||
|
if (ft->autogroup.num_groups < ft->autogroup.required_groups)
|
||
|
group_size = ft->autogroup.group_size;
|
||
|
|
||
|
- /* ft->max_fte == ft->autogroup.max_types */
|
||
|
+ /* max_fte == ft->autogroup.max_types */
|
||
|
if (group_size == 0)
|
||
|
group_size = 1;
|
||
|
|
||
|
@@ -1371,7 +1379,7 @@ static struct mlx5_flow_group *alloc_auto_flow_group(struct mlx5_flow_table *ft
|
||
|
prev = &fg->node.list;
|
||
|
}
|
||
|
|
||
|
- if (candidate_index + group_size > ft->max_fte)
|
||
|
+ if (candidate_index + group_size > max_fte)
|
||
|
return ERR_PTR(-ENOSPC);
|
||
|
|
||
|
fg = alloc_insert_flow_group(ft,
|
||
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h
|
||
|
index c6221ccbdddf..20f54e53dd01 100644
|
||
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h
|
||
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h
|
||
|
@@ -164,6 +164,9 @@ struct mlx5_flow_table {
|
||
|
unsigned int required_groups;
|
||
|
unsigned int group_size;
|
||
|
unsigned int num_groups;
|
||
|
+#ifndef __GENKSYMS__
|
||
|
+ unsigned int max_fte;
|
||
|
+#endif
|
||
|
} autogroup;
|
||
|
/* Protect fwd_rules */
|
||
|
struct mutex lock;
|
||
|
diff --git a/include/linux/mlx5/fs.h b/include/linux/mlx5/fs.h
|
||
|
index 5649a8a70c2e..b918d9724fc2 100644
|
||
|
--- a/include/linux/mlx5/fs.h
|
||
|
+++ b/include/linux/mlx5/fs.h
|
||
|
@@ -165,6 +165,9 @@ struct mlx5_flow_table_attr {
|
||
|
|
||
|
struct {
|
||
|
int max_num_groups;
|
||
|
+#ifndef __GENKSYMS__
|
||
|
+ int num_reserved_entries;
|
||
|
+#endif
|
||
|
} autogroup;
|
||
|
};
|
||
|
|
||
|
--
|
||
|
2.13.6
|
||
|
|