net/mlx5: Accumulate levels for chains prio namespaces
authorPaul Blakey <paulb@mellanox.com>
Mon, 11 Nov 2019 23:34:27 +0000 (00:34 +0100)
committerSaeed Mahameed <saeedm@mellanox.com>
Wed, 13 Nov 2019 21:49:32 +0000 (13:49 -0800)
Tc chains are implemented by creating a chained prio steering type, and
inside it there is a namespace for each chain (FDB_TC_MAX_CHAINS). Each
of those has a list of priorities.

Currently, all namespaces in a prio start at the parent prio level.
But since we can jump from chain (namespace) to another chain in the
same prio, we need the levels for higher chains to be higher as well.
So we created unused prios to account for levels in previous namespaces.

Fix that by accumulating the namespaces levels if we are inside a chained
type prio, and removing the unused prios.

Fixes: 328edb499f99 ('net/mlx5: Split FDB fast path prio to multiple namespaces')
Signed-off-by: Paul Blakey <paulb@mellanox.com>
Reviewed-by: Mark Bloch <markb@mellanox.com>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c

index 9c51fedd890f1cc6a649e4cae13bca1f26fef64e..60d3d88e406c10d3a89d77dcdd0b9283f8585f8c 100644 (file)
@@ -953,7 +953,7 @@ esw_get_prio_table(struct mlx5_eswitch *esw, u32 chain, u16 prio, int level)
                flags |= (MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT |
                          MLX5_FLOW_TABLE_TUNNEL_EN_DECAP);
 
-       table_prio = (chain * FDB_TC_MAX_PRIO) + prio - 1;
+       table_prio = prio - 1;
 
        /* create earlier levels for correct fs_core lookup when
         * connecting tables
index 190c5c71b53410ed1792fa5f06dedac71b7cf98f..3cdad1d1021f9450411f1f35f64d42567318c64d 100644 (file)
@@ -2359,9 +2359,17 @@ static void set_prio_attrs_in_prio(struct fs_prio *prio, int acc_level)
        int acc_level_ns = acc_level;
 
        prio->start_level = acc_level;
-       fs_for_each_ns(ns, prio)
+       fs_for_each_ns(ns, prio) {
                /* This updates start_level and num_levels of ns's priority descendants */
                acc_level_ns = set_prio_attrs_in_ns(ns, acc_level);
+
+               /* If this a prio with chains, and we can jump from one chain
+                * (namepsace) to another, so we accumulate the levels
+                */
+               if (prio->node.type == FS_TYPE_PRIO_CHAINS)
+                       acc_level = acc_level_ns;
+       }
+
        if (!prio->num_levels)
                prio->num_levels = acc_level_ns - prio->start_level;
        WARN_ON(prio->num_levels < acc_level_ns - prio->start_level);