提交 0fd758d6 编写于 作者: M Mark Bloch 提交者: Leon Romanovsky

net/mlx5: Don't unlock fte while still using it

When adding a new rule to an fte, we need to hold the fte lock
until we add that rule to the fte and increase the fte ref count.

Fixes: 0c56b975 ("net/mlx5_core: Introduce flow steering API")
Signed-off-by: NMark Bloch <markb@mellanox.com>
Signed-off-by: NSaeed Mahameed <saeedm@mellanox.com>
Signed-off-by: NLeon Romanovsky <leon@kernel.org>
上级 bd77bf1c
...@@ -1107,9 +1107,8 @@ static struct mlx5_flow_rule *add_rule_fg(struct mlx5_flow_group *fg, ...@@ -1107,9 +1107,8 @@ static struct mlx5_flow_rule *add_rule_fg(struct mlx5_flow_group *fg,
return rule; return rule;
} }
rule = add_rule_fte(fte, fg, dest); rule = add_rule_fte(fte, fg, dest);
unlock_ref_node(&fte->node);
if (IS_ERR(rule)) if (IS_ERR(rule))
goto unlock_fg; goto unlock_fte;
else else
goto add_rule; goto add_rule;
} }
...@@ -1127,6 +1126,7 @@ static struct mlx5_flow_rule *add_rule_fg(struct mlx5_flow_group *fg, ...@@ -1127,6 +1126,7 @@ static struct mlx5_flow_rule *add_rule_fg(struct mlx5_flow_group *fg,
goto unlock_fg; goto unlock_fg;
} }
tree_init_node(&fte->node, 0, del_fte); tree_init_node(&fte->node, 0, del_fte);
nested_lock_ref_node(&fte->node, FS_MUTEX_CHILD);
rule = add_rule_fte(fte, fg, dest); rule = add_rule_fte(fte, fg, dest);
if (IS_ERR(rule)) { if (IS_ERR(rule)) {
kfree(fte); kfree(fte);
...@@ -1139,6 +1139,8 @@ static struct mlx5_flow_rule *add_rule_fg(struct mlx5_flow_group *fg, ...@@ -1139,6 +1139,8 @@ static struct mlx5_flow_rule *add_rule_fg(struct mlx5_flow_group *fg,
list_add(&fte->node.list, prev); list_add(&fte->node.list, prev);
add_rule: add_rule:
tree_add_node(&rule->node, &fte->node); tree_add_node(&rule->node, &fte->node);
unlock_fte:
unlock_ref_node(&fte->node);
unlock_fg: unlock_fg:
unlock_ref_node(&fg->node); unlock_ref_node(&fg->node);
return rule; return rule;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册