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