net/mlx5: fs_core: Make find_closest_ft more generic
[ Upstream commit 618d28a535a0582617465d14e05f3881736a2962 ] As find_closest_ft_recursive is called to find the closest FT, the first parameter of find_closest_ft can be changed from fs_prio to fs_node. Thus this function is extended to find the closest FT for the nodes of any type, not only prios, but also the sub namespaces. Signed-off-by: Jianbo Liu <jianbol@nvidia.com> Signed-off-by: Leon Romanovsky <leonro@nvidia.com> Link: https://lore.kernel.org/r/d3962c2b443ec8dde7a740dc742a1f052d5e256c.1690803944.git.leonro@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Stable-dep-of: c635ca45a7a2 ("net/mlx5: fs_core: Skip the FTs in the same FS_TYPE_PRIO_CHAINS fs_prio") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
7b8717658d
commit
1ca50e5de4
@ -876,18 +876,17 @@ static struct mlx5_flow_table *find_closest_ft_recursive(struct fs_node *root,
|
||||
return ft;
|
||||
}
|
||||
|
||||
/* If reverse is false then return the first flow table in next priority of
|
||||
* prio in the tree, else return the last flow table in the previous priority
|
||||
* of prio in the tree.
|
||||
/* If reverse is false then return the first flow table next to the passed node
|
||||
* in the tree, else return the last flow table before the node in the tree.
|
||||
*/
|
||||
static struct mlx5_flow_table *find_closest_ft(struct fs_prio *prio, bool reverse)
|
||||
static struct mlx5_flow_table *find_closest_ft(struct fs_node *node, bool reverse)
|
||||
{
|
||||
struct mlx5_flow_table *ft = NULL;
|
||||
struct fs_node *curr_node;
|
||||
struct fs_node *parent;
|
||||
|
||||
parent = prio->node.parent;
|
||||
curr_node = &prio->node;
|
||||
parent = node->parent;
|
||||
curr_node = node;
|
||||
while (!ft && parent) {
|
||||
ft = find_closest_ft_recursive(parent, &curr_node->list, reverse);
|
||||
curr_node = parent;
|
||||
@ -897,15 +896,15 @@ static struct mlx5_flow_table *find_closest_ft(struct fs_prio *prio, bool revers
|
||||
}
|
||||
|
||||
/* Assuming all the tree is locked by mutex chain lock */
|
||||
static struct mlx5_flow_table *find_next_chained_ft(struct fs_prio *prio)
|
||||
static struct mlx5_flow_table *find_next_chained_ft(struct fs_node *node)
|
||||
{
|
||||
return find_closest_ft(prio, false);
|
||||
return find_closest_ft(node, false);
|
||||
}
|
||||
|
||||
/* Assuming all the tree is locked by mutex chain lock */
|
||||
static struct mlx5_flow_table *find_prev_chained_ft(struct fs_prio *prio)
|
||||
static struct mlx5_flow_table *find_prev_chained_ft(struct fs_node *node)
|
||||
{
|
||||
return find_closest_ft(prio, true);
|
||||
return find_closest_ft(node, true);
|
||||
}
|
||||
|
||||
static struct mlx5_flow_table *find_next_fwd_ft(struct mlx5_flow_table *ft,
|
||||
@ -917,7 +916,7 @@ static struct mlx5_flow_table *find_next_fwd_ft(struct mlx5_flow_table *ft,
|
||||
next_ns = flow_act->action & MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_NS;
|
||||
fs_get_obj(prio, next_ns ? ft->ns->node.parent : ft->node.parent);
|
||||
|
||||
return find_next_chained_ft(prio);
|
||||
return find_next_chained_ft(&prio->node);
|
||||
}
|
||||
|
||||
static int connect_fts_in_prio(struct mlx5_core_dev *dev,
|
||||
@ -948,7 +947,7 @@ static int connect_prev_fts(struct mlx5_core_dev *dev,
|
||||
{
|
||||
struct mlx5_flow_table *prev_ft;
|
||||
|
||||
prev_ft = find_prev_chained_ft(prio);
|
||||
prev_ft = find_prev_chained_ft(&prio->node);
|
||||
if (prev_ft) {
|
||||
struct fs_prio *prev_prio;
|
||||
|
||||
@ -1094,7 +1093,7 @@ static int connect_flow_table(struct mlx5_core_dev *dev, struct mlx5_flow_table
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
next_ft = first_ft ? first_ft : find_next_chained_ft(prio);
|
||||
next_ft = first_ft ? first_ft : find_next_chained_ft(&prio->node);
|
||||
err = connect_fwd_rules(dev, ft, next_ft);
|
||||
if (err)
|
||||
return err;
|
||||
@ -1169,7 +1168,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);
|
||||
next_ft = unmanaged ? ft_attr->next_ft :
|
||||
find_next_chained_ft(fs_prio);
|
||||
find_next_chained_ft(&fs_prio->node);
|
||||
ft->def_miss_action = ns->def_miss_action;
|
||||
ft->ns = ns;
|
||||
err = root->cmds->create_flow_table(root, ft, ft_attr, next_ft);
|
||||
@ -2163,7 +2162,7 @@ static struct mlx5_flow_table *find_next_ft(struct mlx5_flow_table *ft)
|
||||
|
||||
if (!list_is_last(&ft->node.list, &prio->node.children))
|
||||
return list_next_entry(ft, node.list);
|
||||
return find_next_chained_ft(prio);
|
||||
return find_next_chained_ft(&prio->node);
|
||||
}
|
||||
|
||||
static int update_root_ft_destroy(struct mlx5_flow_table *ft)
|
||||
|
Loading…
Reference in New Issue
Block a user