|
Thomas Bogendoerfer |
0f56aa |
From: Paul Blakey <paulb@mellanox.com>
|
|
Thomas Bogendoerfer |
0f56aa |
Date: Tue, 12 Nov 2019 00:34:27 +0100
|
|
Thomas Bogendoerfer |
0f56aa |
Subject: net/mlx5: Accumulate levels for chains prio namespaces
|
|
Thomas Bogendoerfer |
0f56aa |
Patch-mainline: v5.5-rc1
|
|
Thomas Bogendoerfer |
0f56aa |
Git-commit: 34b13cb3eaa5ad205f4497da6420262da4940b9e
|
|
Thomas Bogendoerfer |
0f56aa |
References: bsc#1103990 FATE#326006
|
|
Thomas Bogendoerfer |
0f56aa |
|
|
Thomas Bogendoerfer |
0f56aa |
Tc chains are implemented by creating a chained prio steering type, and
|
|
Thomas Bogendoerfer |
0f56aa |
inside it there is a namespace for each chain (FDB_TC_MAX_CHAINS). Each
|
|
Thomas Bogendoerfer |
0f56aa |
of those has a list of priorities.
|
|
Thomas Bogendoerfer |
0f56aa |
|
|
Thomas Bogendoerfer |
0f56aa |
Currently, all namespaces in a prio start at the parent prio level.
|
|
Thomas Bogendoerfer |
0f56aa |
But since we can jump from chain (namespace) to another chain in the
|
|
Thomas Bogendoerfer |
0f56aa |
same prio, we need the levels for higher chains to be higher as well.
|
|
Thomas Bogendoerfer |
0f56aa |
So we created unused prios to account for levels in previous namespaces.
|
|
Thomas Bogendoerfer |
0f56aa |
|
|
Thomas Bogendoerfer |
0f56aa |
Fix that by accumulating the namespaces levels if we are inside a chained
|
|
Thomas Bogendoerfer |
0f56aa |
type prio, and removing the unused prios.
|
|
Thomas Bogendoerfer |
0f56aa |
|
|
Thomas Bogendoerfer |
0f56aa |
Fixes: 328edb499f99 ('net/mlx5: Split FDB fast path prio to multiple namespaces')
|
|
Thomas Bogendoerfer |
0f56aa |
Signed-off-by: Paul Blakey <paulb@mellanox.com>
|
|
Thomas Bogendoerfer |
0f56aa |
Reviewed-by: Mark Bloch <markb@mellanox.com>
|
|
Thomas Bogendoerfer |
0f56aa |
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
|
|
Thomas Bogendoerfer |
0f56aa |
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
|
|
Thomas Bogendoerfer |
0f56aa |
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
|
|
Thomas Bogendoerfer |
0f56aa |
---
|
|
Thomas Bogendoerfer |
0f56aa |
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c | 2 +-
|
|
Thomas Bogendoerfer |
0f56aa |
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 10 +++++++++-
|
|
Thomas Bogendoerfer |
0f56aa |
2 files changed, 10 insertions(+), 2 deletions(-)
|
|
Thomas Bogendoerfer |
0f56aa |
|
|
Thomas Bogendoerfer |
0f56aa |
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
|
|
Thomas Bogendoerfer |
0f56aa |
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
|
|
Thomas Bogendoerfer |
0f56aa |
@@ -696,7 +696,7 @@ esw_get_prio_table(struct mlx5_eswitch *
|
|
Thomas Bogendoerfer |
0f56aa |
flags |= (MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT |
|
|
Thomas Bogendoerfer |
0f56aa |
MLX5_FLOW_TABLE_TUNNEL_EN_DECAP);
|
|
Thomas Bogendoerfer |
0f56aa |
|
|
Thomas Bogendoerfer |
0f56aa |
- table_prio = (chain * FDB_MAX_PRIO) + prio - 1;
|
|
Thomas Bogendoerfer |
0f56aa |
+ table_prio = prio - 1;
|
|
Thomas Bogendoerfer |
0f56aa |
|
|
Thomas Bogendoerfer |
0f56aa |
/* create earlier levels for correct fs_core lookup when
|
|
Thomas Bogendoerfer |
0f56aa |
* connecting tables
|
|
Thomas Bogendoerfer |
0f56aa |
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
|
|
Thomas Bogendoerfer |
0f56aa |
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
|
|
Thomas Bogendoerfer |
0f56aa |
@@ -2288,9 +2288,17 @@ static void set_prio_attrs_in_prio(struc
|
|
Thomas Bogendoerfer |
0f56aa |
int acc_level_ns = acc_level;
|
|
Thomas Bogendoerfer |
0f56aa |
|
|
Thomas Bogendoerfer |
0f56aa |
prio->start_level = acc_level;
|
|
Thomas Bogendoerfer |
0f56aa |
- fs_for_each_ns(ns, prio)
|
|
Thomas Bogendoerfer |
0f56aa |
+ fs_for_each_ns(ns, prio) {
|
|
Thomas Bogendoerfer |
0f56aa |
/* This updates start_level and num_levels of ns's priority descendants */
|
|
Thomas Bogendoerfer |
0f56aa |
acc_level_ns = set_prio_attrs_in_ns(ns, acc_level);
|
|
Thomas Bogendoerfer |
0f56aa |
+
|
|
Thomas Bogendoerfer |
0f56aa |
+ /* If this a prio with chains, and we can jump from one chain
|
|
Thomas Bogendoerfer |
0f56aa |
+ * (namepsace) to another, so we accumulate the levels
|
|
Thomas Bogendoerfer |
0f56aa |
+ */
|
|
Thomas Bogendoerfer |
0f56aa |
+ if (prio->node.type == FS_TYPE_PRIO_CHAINS)
|
|
Thomas Bogendoerfer |
0f56aa |
+ acc_level = acc_level_ns;
|
|
Thomas Bogendoerfer |
0f56aa |
+ }
|
|
Thomas Bogendoerfer |
0f56aa |
+
|
|
Thomas Bogendoerfer |
0f56aa |
if (!prio->num_levels)
|
|
Thomas Bogendoerfer |
0f56aa |
prio->num_levels = acc_level_ns - prio->start_level;
|
|
Thomas Bogendoerfer |
0f56aa |
WARN_ON(prio->num_levels < acc_level_ns - prio->start_level);
|