Commit 13de6c10 authored by Maor Gottlieb's avatar Maor Gottlieb Committed by David S. Miller

net/mlx5: Support different attributes for priorities in namespace

Currently, namespace could be initialized only
with priorities with the same attributes.
Add support to initialize namespace with priorities
with different attributes(e.g. different number of levels).
Signed-off-by: default avatarMaor Gottlieb <maorg@mellanox.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d63cd286
...@@ -74,9 +74,10 @@ ...@@ -74,9 +74,10 @@
#define BY_PASS_MIN_LEVEL (KERNEL_MIN_LEVEL + MLX5_BY_PASS_NUM_PRIOS +\ #define BY_PASS_MIN_LEVEL (KERNEL_MIN_LEVEL + MLX5_BY_PASS_NUM_PRIOS +\
LEFTOVERS_NUM_PRIOS) LEFTOVERS_NUM_PRIOS)
#define KERNEL_NUM_LEVELS 3 #define KERNEL_NIC_PRIO_NUM_LEVELS 2
#define KERNEL_NUM_PRIOS 2 #define KERNEL_NIC_NUM_PRIOS 1
#define KERNEL_MIN_LEVEL 2 /* One more level for tc */
#define KERNEL_MIN_LEVEL (KERNEL_NIC_PRIO_NUM_LEVELS + 1)
#define ANCHOR_NUM_LEVELS 1 #define ANCHOR_NUM_LEVELS 1
#define ANCHOR_NUM_PRIOS 1 #define ANCHOR_NUM_PRIOS 1
...@@ -106,8 +107,9 @@ static struct init_tree_node { ...@@ -106,8 +107,9 @@ static struct init_tree_node {
ADD_NS(ADD_MULTIPLE_PRIO(MLX5_BY_PASS_NUM_PRIOS, ADD_NS(ADD_MULTIPLE_PRIO(MLX5_BY_PASS_NUM_PRIOS,
BY_PASS_PRIO_NUM_LEVELS))), BY_PASS_PRIO_NUM_LEVELS))),
ADD_PRIO(0, KERNEL_MIN_LEVEL, 0, {}, ADD_PRIO(0, KERNEL_MIN_LEVEL, 0, {},
ADD_NS(ADD_MULTIPLE_PRIO(KERNEL_NUM_PRIOS, ADD_NS(ADD_MULTIPLE_PRIO(1, 1),
KERNEL_NUM_LEVELS))), ADD_MULTIPLE_PRIO(KERNEL_NIC_NUM_PRIOS,
KERNEL_NIC_PRIO_NUM_LEVELS))),
ADD_PRIO(0, BY_PASS_MIN_LEVEL, 0, ADD_PRIO(0, BY_PASS_MIN_LEVEL, 0,
FS_REQUIRED_CAPS(FS_CAP(flow_table_properties_nic_receive.flow_modify_en), FS_REQUIRED_CAPS(FS_CAP(flow_table_properties_nic_receive.flow_modify_en),
FS_CAP(flow_table_properties_nic_receive.modify_root), FS_CAP(flow_table_properties_nic_receive.modify_root),
...@@ -1375,14 +1377,14 @@ static struct mlx5_flow_namespace *fs_create_namespace(struct fs_prio *prio) ...@@ -1375,14 +1377,14 @@ static struct mlx5_flow_namespace *fs_create_namespace(struct fs_prio *prio)
return ns; return ns;
} }
static int create_leaf_prios(struct mlx5_flow_namespace *ns, struct init_tree_node static int create_leaf_prios(struct mlx5_flow_namespace *ns, int prio,
*prio_metadata) struct init_tree_node *prio_metadata)
{ {
struct fs_prio *fs_prio; struct fs_prio *fs_prio;
int i; int i;
for (i = 0; i < prio_metadata->num_leaf_prios; i++) { for (i = 0; i < prio_metadata->num_leaf_prios; i++) {
fs_prio = fs_create_prio(ns, i, prio_metadata->num_levels); fs_prio = fs_create_prio(ns, prio++, prio_metadata->num_levels);
if (IS_ERR(fs_prio)) if (IS_ERR(fs_prio))
return PTR_ERR(fs_prio); return PTR_ERR(fs_prio);
} }
...@@ -1409,7 +1411,7 @@ static int init_root_tree_recursive(struct mlx5_core_dev *dev, ...@@ -1409,7 +1411,7 @@ static int init_root_tree_recursive(struct mlx5_core_dev *dev,
struct init_tree_node *init_node, struct init_tree_node *init_node,
struct fs_node *fs_parent_node, struct fs_node *fs_parent_node,
struct init_tree_node *init_parent_node, struct init_tree_node *init_parent_node,
int index) int prio)
{ {
int max_ft_level = MLX5_CAP_FLOWTABLE(dev, int max_ft_level = MLX5_CAP_FLOWTABLE(dev,
flow_table_properties_nic_receive. flow_table_properties_nic_receive.
...@@ -1427,8 +1429,8 @@ static int init_root_tree_recursive(struct mlx5_core_dev *dev, ...@@ -1427,8 +1429,8 @@ static int init_root_tree_recursive(struct mlx5_core_dev *dev,
fs_get_obj(fs_ns, fs_parent_node); fs_get_obj(fs_ns, fs_parent_node);
if (init_node->num_leaf_prios) if (init_node->num_leaf_prios)
return create_leaf_prios(fs_ns, init_node); return create_leaf_prios(fs_ns, prio, init_node);
fs_prio = fs_create_prio(fs_ns, index, init_node->num_levels); fs_prio = fs_create_prio(fs_ns, prio, init_node->num_levels);
if (IS_ERR(fs_prio)) if (IS_ERR(fs_prio))
return PTR_ERR(fs_prio); return PTR_ERR(fs_prio);
base = &fs_prio->node; base = &fs_prio->node;
...@@ -1441,11 +1443,16 @@ static int init_root_tree_recursive(struct mlx5_core_dev *dev, ...@@ -1441,11 +1443,16 @@ static int init_root_tree_recursive(struct mlx5_core_dev *dev,
} else { } else {
return -EINVAL; return -EINVAL;
} }
prio = 0;
for (i = 0; i < init_node->ar_size; i++) { for (i = 0; i < init_node->ar_size; i++) {
err = init_root_tree_recursive(dev, &init_node->children[i], err = init_root_tree_recursive(dev, &init_node->children[i],
base, init_node, i); base, init_node, prio);
if (err) if (err)
return err; return err;
if (init_node->children[i].type == FS_TYPE_PRIO &&
init_node->children[i].num_leaf_prios) {
prio += init_node->children[i].num_leaf_prios;
}
} }
return 0; return 0;
......
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