Commit f66ad830 authored by Mark Zhang's avatar Mark Zhang Committed by Leon Romanovsky

net/mlx5: Add per-namespace flow table default miss action support

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: default avatarMark Zhang <markz@mellanox.com>
Reviewed-by: default avatarMark Bloch <markb@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
parent 1eba383f
...@@ -182,7 +182,7 @@ static int mlx5_cmd_create_flow_table(struct mlx5_flow_root_namespace *ns, ...@@ -182,7 +182,7 @@ static int mlx5_cmd_create_flow_table(struct mlx5_flow_root_namespace *ns,
} else { } else {
MLX5_SET(create_flow_table_in, in, MLX5_SET(create_flow_table_in, in,
flow_table_context.table_miss_action, flow_table_context.table_miss_action,
ns->def_miss_action); ft->def_miss_action);
} }
break; break;
...@@ -262,7 +262,7 @@ static int mlx5_cmd_modify_flow_table(struct mlx5_flow_root_namespace *ns, ...@@ -262,7 +262,7 @@ static int mlx5_cmd_modify_flow_table(struct mlx5_flow_root_namespace *ns,
} else { } else {
MLX5_SET(modify_flow_table_in, in, MLX5_SET(modify_flow_table_in, in,
flow_table_context.table_miss_action, flow_table_context.table_miss_action,
ns->def_miss_action); ft->def_miss_action);
} }
} }
......
...@@ -60,7 +60,8 @@ ...@@ -60,7 +60,8 @@
ADD_PRIO(num_prios_val, 0, num_levels_val, {},\ ADD_PRIO(num_prios_val, 0, num_levels_val, {},\
__VA_ARGS__)\ __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__},\ .children = (struct init_tree_node[]) {__VA_ARGS__},\
.ar_size = INIT_TREE_NODE_ARRAY_SIZE(__VA_ARGS__) \ .ar_size = INIT_TREE_NODE_ARRAY_SIZE(__VA_ARGS__) \
} }
...@@ -131,33 +132,41 @@ static struct init_tree_node { ...@@ -131,33 +132,41 @@ static struct init_tree_node {
int num_leaf_prios; int num_leaf_prios;
int prio; int prio;
int num_levels; int num_levels;
enum mlx5_flow_table_miss_action def_miss_action;
} root_fs = { } root_fs = {
.type = FS_TYPE_NAMESPACE, .type = FS_TYPE_NAMESPACE,
.ar_size = 7, .ar_size = 7,
.children = (struct init_tree_node[]) { .children = (struct init_tree_node[]){
ADD_PRIO(0, BY_PASS_MIN_LEVEL, 0, ADD_PRIO(0, BY_PASS_MIN_LEVEL, 0, FS_CHAINING_CAPS,
FS_CHAINING_CAPS, ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
ADD_NS(ADD_MULTIPLE_PRIO(MLX5_BY_PASS_NUM_PRIOS, ADD_MULTIPLE_PRIO(MLX5_BY_PASS_NUM_PRIOS,
BY_PASS_PRIO_NUM_LEVELS))), BY_PASS_PRIO_NUM_LEVELS))),
ADD_PRIO(0, LAG_MIN_LEVEL, 0, ADD_PRIO(0, LAG_MIN_LEVEL, 0, FS_CHAINING_CAPS,
FS_CHAINING_CAPS, ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
ADD_NS(ADD_MULTIPLE_PRIO(LAG_NUM_PRIOS, ADD_MULTIPLE_PRIO(LAG_NUM_PRIOS,
LAG_PRIO_NUM_LEVELS))), LAG_PRIO_NUM_LEVELS))),
ADD_PRIO(0, OFFLOADS_MIN_LEVEL, 0, {}, ADD_PRIO(0, OFFLOADS_MIN_LEVEL, 0, {},
ADD_NS(ADD_MULTIPLE_PRIO(OFFLOADS_NUM_PRIOS, OFFLOADS_MAX_FT))), ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
ADD_PRIO(0, ETHTOOL_MIN_LEVEL, 0, ADD_MULTIPLE_PRIO(OFFLOADS_NUM_PRIOS,
FS_CHAINING_CAPS, OFFLOADS_MAX_FT))),
ADD_NS(ADD_MULTIPLE_PRIO(ETHTOOL_NUM_PRIOS, 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))), ETHTOOL_PRIO_NUM_LEVELS))),
ADD_PRIO(0, KERNEL_MIN_LEVEL, 0, {}, ADD_PRIO(0, KERNEL_MIN_LEVEL, 0, {},
ADD_NS(ADD_MULTIPLE_PRIO(KERNEL_NIC_TC_NUM_PRIOS, KERNEL_NIC_TC_NUM_LEVELS), 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, ADD_MULTIPLE_PRIO(KERNEL_NIC_NUM_PRIOS,
KERNEL_NIC_PRIO_NUM_LEVELS))), KERNEL_NIC_PRIO_NUM_LEVELS))),
ADD_PRIO(0, BY_PASS_MIN_LEVEL, 0, ADD_PRIO(0, BY_PASS_MIN_LEVEL, 0, FS_CHAINING_CAPS,
FS_CHAINING_CAPS, ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
ADD_NS(ADD_MULTIPLE_PRIO(LEFTOVERS_NUM_PRIOS, LEFTOVERS_NUM_LEVELS))), ADD_MULTIPLE_PRIO(LEFTOVERS_NUM_PRIOS,
LEFTOVERS_NUM_LEVELS))),
ADD_PRIO(0, ANCHOR_MIN_LEVEL, 0, {}, ADD_PRIO(0, ANCHOR_MIN_LEVEL, 0, {},
ADD_NS(ADD_MULTIPLE_PRIO(ANCHOR_NUM_PRIOS, ANCHOR_NUM_LEVELS))), 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 = { ...@@ -167,7 +176,8 @@ static struct init_tree_node egress_root_fs = {
.children = (struct init_tree_node[]) { .children = (struct init_tree_node[]) {
ADD_PRIO(0, MLX5_BY_PASS_NUM_PRIOS, 0, ADD_PRIO(0, MLX5_BY_PASS_NUM_PRIOS, 0,
FS_CHAINING_CAPS_EGRESS, 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))), BY_PASS_PRIO_NUM_LEVELS))),
} }
}; };
...@@ -1014,6 +1024,7 @@ static struct mlx5_flow_table *__mlx5_create_flow_table(struct mlx5_flow_namespa ...@@ -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); tree_init_node(&ft->node, del_hw_flow_table, del_sw_flow_table);
log_table_sz = ft->max_fte ? ilog2(ft->max_fte) : 0; log_table_sz = ft->max_fte ? ilog2(ft->max_fte) : 0;
next_ft = find_next_chained_ft(fs_prio); 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); err = root->cmds->create_flow_table(root, ft, log_table_sz, next_ft);
if (err) if (err)
goto free_ft; goto free_ft;
...@@ -2155,7 +2166,8 @@ static struct mlx5_flow_namespace *fs_init_namespace(struct mlx5_flow_namespace ...@@ -2155,7 +2166,8 @@ static struct mlx5_flow_namespace *fs_init_namespace(struct mlx5_flow_namespace
return ns; 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; struct mlx5_flow_namespace *ns;
...@@ -2164,6 +2176,7 @@ static struct mlx5_flow_namespace *fs_create_namespace(struct fs_prio *prio) ...@@ -2164,6 +2176,7 @@ static struct mlx5_flow_namespace *fs_create_namespace(struct fs_prio *prio)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
fs_init_namespace(ns); fs_init_namespace(ns);
ns->def_miss_action = def_miss_act;
tree_init_node(&ns->node, NULL, del_sw_ns); tree_init_node(&ns->node, NULL, del_sw_ns);
tree_add_node(&ns->node, &prio->node); tree_add_node(&ns->node, &prio->node);
list_add_tail(&ns->node.list, &prio->node.children); list_add_tail(&ns->node.list, &prio->node.children);
...@@ -2230,7 +2243,7 @@ static int init_root_tree_recursive(struct mlx5_flow_steering *steering, ...@@ -2230,7 +2243,7 @@ static int init_root_tree_recursive(struct mlx5_flow_steering *steering,
base = &fs_prio->node; base = &fs_prio->node;
} else if (init_node->type == FS_TYPE_NAMESPACE) { } else if (init_node->type == FS_TYPE_NAMESPACE) {
fs_get_obj(fs_prio, fs_parent_node); 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)) if (IS_ERR(fs_ns))
return PTR_ERR(fs_ns); return PTR_ERR(fs_ns);
base = &fs_ns->node; base = &fs_ns->node;
...@@ -2500,7 +2513,7 @@ static int init_rdma_rx_root_ns(struct mlx5_flow_steering *steering) ...@@ -2500,7 +2513,7 @@ static int init_rdma_rx_root_ns(struct mlx5_flow_steering *steering)
if (!steering->rdma_rx_root_ns) if (!steering->rdma_rx_root_ns)
return -ENOMEM; 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; MLX5_FLOW_TABLE_MISS_ACTION_SWITCH_DOMAIN;
/* Create single prio */ /* Create single prio */
...@@ -2543,7 +2556,7 @@ static int init_fdb_root_ns(struct mlx5_flow_steering *steering) ...@@ -2543,7 +2556,7 @@ static int init_fdb_root_ns(struct mlx5_flow_steering *steering)
} }
for (chain = 0; chain <= FDB_MAX_CHAIN; chain++) { 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)) { if (IS_ERR(ns)) {
err = PTR_ERR(ns); err = PTR_ERR(ns);
goto out_err; goto out_err;
......
...@@ -145,6 +145,7 @@ struct mlx5_flow_table { ...@@ -145,6 +145,7 @@ struct mlx5_flow_table {
struct list_head fwd_rules; struct list_head fwd_rules;
u32 flags; u32 flags;
struct rhltable fgs_hash; struct rhltable fgs_hash;
enum mlx5_flow_table_miss_action def_miss_action;
}; };
struct mlx5_ft_underlay_qp { struct mlx5_ft_underlay_qp {
...@@ -191,6 +192,7 @@ struct fs_prio { ...@@ -191,6 +192,7 @@ struct fs_prio {
struct mlx5_flow_namespace { struct mlx5_flow_namespace {
/* parent == NULL => root ns */ /* parent == NULL => root ns */
struct fs_node node; struct fs_node node;
enum mlx5_flow_table_miss_action def_miss_action;
}; };
struct mlx5_flow_group_mask { struct mlx5_flow_group_mask {
...@@ -219,7 +221,6 @@ struct mlx5_flow_root_namespace { ...@@ -219,7 +221,6 @@ struct mlx5_flow_root_namespace {
struct mutex chain_lock; struct mutex chain_lock;
struct list_head underlay_qpns; struct list_head underlay_qpns;
const struct mlx5_flow_cmds *cmds; 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); int mlx5_init_fc_stats(struct mlx5_core_dev *dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment