net/mlx5: Add per-namespace flow table default miss action support
authorMark Zhang <markz@mellanox.com>
Mon, 19 Aug 2019 11:36:24 +0000 (14:36 +0300)
committerLeon Romanovsky <leonro@mellanox.com>
Wed, 21 Aug 2019 13:57:00 +0000 (16:57 +0300)
Currently all the namespaces under the same steering domain share the same
default table miss action, however in some situations (e.g., RDMA RX)
different actions are required. This patch adds a per-namespace default
table miss action instead of using the miss action of the steering domain.

Signed-off-by: Mark Zhang <markz@mellanox.com>
Reviewed-by: Mark Bloch <markb@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
drivers/net/ethernet/mellanox/mlx5/core/fs_core.h

index b84a225bbe86cfe0a50b85caa645eb5da516e3bc..1e3381604b3d01f236a3d085eb6efb256ae669c3 100644 (file)
@@ -182,7 +182,7 @@ static int mlx5_cmd_create_flow_table(struct mlx5_flow_root_namespace *ns,
                } else {
                        MLX5_SET(create_flow_table_in, in,
                                 flow_table_context.table_miss_action,
-                                ns->def_miss_action);
+                                ft->def_miss_action);
                }
                break;
 
@@ -262,7 +262,7 @@ static int mlx5_cmd_modify_flow_table(struct mlx5_flow_root_namespace *ns,
                } else {
                        MLX5_SET(modify_flow_table_in, in,
                                 flow_table_context.table_miss_action,
-                                ns->def_miss_action);
+                                ft->def_miss_action);
                }
        }
 
index 3e99799bdb40c53104960aca0f0f97a04d7780e1..fb3cfdfbafbe1ffb78d36aa948a3843d6227dd3d 100644 (file)
@@ -60,7 +60,8 @@
        ADD_PRIO(num_prios_val, 0, num_levels_val, {},\
                 __VA_ARGS__)\
 
-#define ADD_NS(...) {.type = FS_TYPE_NAMESPACE,\
+#define ADD_NS(def_miss_act, ...) {.type = FS_TYPE_NAMESPACE,  \
+       .def_miss_action = def_miss_act,\
        .children = (struct init_tree_node[]) {__VA_ARGS__},\
        .ar_size = INIT_TREE_NODE_ARRAY_SIZE(__VA_ARGS__) \
 }
@@ -131,33 +132,41 @@ static struct init_tree_node {
        int num_leaf_prios;
        int prio;
        int num_levels;
+       enum mlx5_flow_table_miss_action def_miss_action;
 } root_fs = {
        .type = FS_TYPE_NAMESPACE,
        .ar_size = 7,
-       .children = (struct init_tree_node[]) {
-               ADD_PRIO(0, BY_PASS_MIN_LEVEL, 0,
-                        FS_CHAINING_CAPS,
-                        ADD_NS(ADD_MULTIPLE_PRIO(MLX5_BY_PASS_NUM_PRIOS,
-                                                 BY_PASS_PRIO_NUM_LEVELS))),
-               ADD_PRIO(0, LAG_MIN_LEVEL, 0,
-                        FS_CHAINING_CAPS,
-                        ADD_NS(ADD_MULTIPLE_PRIO(LAG_NUM_PRIOS,
-                                                 LAG_PRIO_NUM_LEVELS))),
-               ADD_PRIO(0, OFFLOADS_MIN_LEVEL, 0, {},
-                        ADD_NS(ADD_MULTIPLE_PRIO(OFFLOADS_NUM_PRIOS, OFFLOADS_MAX_FT))),
-               ADD_PRIO(0, ETHTOOL_MIN_LEVEL, 0,
-                        FS_CHAINING_CAPS,
-                        ADD_NS(ADD_MULTIPLE_PRIO(ETHTOOL_NUM_PRIOS,
-                                                 ETHTOOL_PRIO_NUM_LEVELS))),
-               ADD_PRIO(0, KERNEL_MIN_LEVEL, 0, {},
-                        ADD_NS(ADD_MULTIPLE_PRIO(KERNEL_NIC_TC_NUM_PRIOS, KERNEL_NIC_TC_NUM_LEVELS),
-                               ADD_MULTIPLE_PRIO(KERNEL_NIC_NUM_PRIOS,
-                                                 KERNEL_NIC_PRIO_NUM_LEVELS))),
-               ADD_PRIO(0, BY_PASS_MIN_LEVEL, 0,
-                        FS_CHAINING_CAPS,
-                        ADD_NS(ADD_MULTIPLE_PRIO(LEFTOVERS_NUM_PRIOS, LEFTOVERS_NUM_LEVELS))),
-               ADD_PRIO(0, ANCHOR_MIN_LEVEL, 0, {},
-                        ADD_NS(ADD_MULTIPLE_PRIO(ANCHOR_NUM_PRIOS, ANCHOR_NUM_LEVELS))),
+         .children = (struct init_tree_node[]){
+                 ADD_PRIO(0, BY_PASS_MIN_LEVEL, 0, FS_CHAINING_CAPS,
+                          ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
+                                 ADD_MULTIPLE_PRIO(MLX5_BY_PASS_NUM_PRIOS,
+                                                   BY_PASS_PRIO_NUM_LEVELS))),
+                 ADD_PRIO(0, LAG_MIN_LEVEL, 0, FS_CHAINING_CAPS,
+                          ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
+                                 ADD_MULTIPLE_PRIO(LAG_NUM_PRIOS,
+                                                   LAG_PRIO_NUM_LEVELS))),
+                 ADD_PRIO(0, OFFLOADS_MIN_LEVEL, 0, {},
+                          ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
+                                 ADD_MULTIPLE_PRIO(OFFLOADS_NUM_PRIOS,
+                                                   OFFLOADS_MAX_FT))),
+                 ADD_PRIO(0, ETHTOOL_MIN_LEVEL, 0, FS_CHAINING_CAPS,
+                          ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
+                                 ADD_MULTIPLE_PRIO(ETHTOOL_NUM_PRIOS,
+                                                   ETHTOOL_PRIO_NUM_LEVELS))),
+                 ADD_PRIO(0, KERNEL_MIN_LEVEL, 0, {},
+                          ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
+                                 ADD_MULTIPLE_PRIO(KERNEL_NIC_TC_NUM_PRIOS,
+                                                   KERNEL_NIC_TC_NUM_LEVELS),
+                                 ADD_MULTIPLE_PRIO(KERNEL_NIC_NUM_PRIOS,
+                                                   KERNEL_NIC_PRIO_NUM_LEVELS))),
+                 ADD_PRIO(0, BY_PASS_MIN_LEVEL, 0, FS_CHAINING_CAPS,
+                          ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
+                                 ADD_MULTIPLE_PRIO(LEFTOVERS_NUM_PRIOS,
+                                                   LEFTOVERS_NUM_LEVELS))),
+                 ADD_PRIO(0, ANCHOR_MIN_LEVEL, 0, {},
+                          ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
+                                 ADD_MULTIPLE_PRIO(ANCHOR_NUM_PRIOS,
+                                                   ANCHOR_NUM_LEVELS))),
        }
 };
 
@@ -167,7 +176,8 @@ static struct init_tree_node egress_root_fs = {
        .children = (struct init_tree_node[]) {
                ADD_PRIO(0, MLX5_BY_PASS_NUM_PRIOS, 0,
                         FS_CHAINING_CAPS_EGRESS,
-                        ADD_NS(ADD_MULTIPLE_PRIO(MLX5_BY_PASS_NUM_PRIOS,
+                        ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
+                               ADD_MULTIPLE_PRIO(MLX5_BY_PASS_NUM_PRIOS,
                                                  BY_PASS_PRIO_NUM_LEVELS))),
        }
 };
@@ -1014,6 +1024,7 @@ static struct mlx5_flow_table *__mlx5_create_flow_table(struct mlx5_flow_namespa
        tree_init_node(&ft->node, del_hw_flow_table, del_sw_flow_table);
        log_table_sz = ft->max_fte ? ilog2(ft->max_fte) : 0;
        next_ft = find_next_chained_ft(fs_prio);
+       ft->def_miss_action = ns->def_miss_action;
        err = root->cmds->create_flow_table(root, ft, log_table_sz, next_ft);
        if (err)
                goto free_ft;
@@ -2155,7 +2166,8 @@ static struct mlx5_flow_namespace *fs_init_namespace(struct mlx5_flow_namespace
        return ns;
 }
 
-static struct mlx5_flow_namespace *fs_create_namespace(struct fs_prio *prio)
+static struct mlx5_flow_namespace *fs_create_namespace(struct fs_prio *prio,
+                                                      int def_miss_act)
 {
        struct mlx5_flow_namespace      *ns;
 
@@ -2164,6 +2176,7 @@ static struct mlx5_flow_namespace *fs_create_namespace(struct fs_prio *prio)
                return ERR_PTR(-ENOMEM);
 
        fs_init_namespace(ns);
+       ns->def_miss_action = def_miss_act;
        tree_init_node(&ns->node, NULL, del_sw_ns);
        tree_add_node(&ns->node, &prio->node);
        list_add_tail(&ns->node.list, &prio->node.children);
@@ -2230,7 +2243,7 @@ static int init_root_tree_recursive(struct mlx5_flow_steering *steering,
                base = &fs_prio->node;
        } else if (init_node->type == FS_TYPE_NAMESPACE) {
                fs_get_obj(fs_prio, fs_parent_node);
-               fs_ns = fs_create_namespace(fs_prio);
+               fs_ns = fs_create_namespace(fs_prio, init_node->def_miss_action);
                if (IS_ERR(fs_ns))
                        return PTR_ERR(fs_ns);
                base = &fs_ns->node;
@@ -2500,7 +2513,7 @@ static int init_rdma_rx_root_ns(struct mlx5_flow_steering *steering)
        if (!steering->rdma_rx_root_ns)
                return -ENOMEM;
 
-       steering->rdma_rx_root_ns->def_miss_action =
+       steering->rdma_rx_root_ns->ns.def_miss_action =
                MLX5_FLOW_TABLE_MISS_ACTION_SWITCH_DOMAIN;
 
        /* Create single prio */
@@ -2543,7 +2556,7 @@ static int init_fdb_root_ns(struct mlx5_flow_steering *steering)
        }
 
        for (chain = 0; chain <= FDB_MAX_CHAIN; chain++) {
-               ns = fs_create_namespace(maj_prio);
+               ns = fs_create_namespace(maj_prio, MLX5_FLOW_TABLE_MISS_ACTION_DEF);
                if (IS_ERR(ns)) {
                        err = PTR_ERR(ns);
                        goto out_err;
index c48c382f926f33b5747c5f5603c18713a03e6bd0..69f809831959048336f06456b974634ac721c2ea 100644 (file)
@@ -145,6 +145,7 @@ struct mlx5_flow_table {
        struct list_head                fwd_rules;
        u32                             flags;
        struct rhltable                 fgs_hash;
+       enum mlx5_flow_table_miss_action def_miss_action;
 };
 
 struct mlx5_ft_underlay_qp {
@@ -191,6 +192,7 @@ struct fs_prio {
 struct mlx5_flow_namespace {
        /* parent == NULL => root ns */
        struct  fs_node                 node;
+       enum mlx5_flow_table_miss_action def_miss_action;
 };
 
 struct mlx5_flow_group_mask {
@@ -219,7 +221,6 @@ struct mlx5_flow_root_namespace {
        struct mutex                    chain_lock;
        struct list_head                underlay_qpns;
        const struct mlx5_flow_cmds     *cmds;
-       enum mlx5_flow_table_miss_action def_miss_action;
 };
 
 int mlx5_init_fc_stats(struct mlx5_core_dev *dev);