aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Bloch <markb@mellanox.com>2016-09-05 06:58:04 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-02-18 09:11:43 -0500
commit0e0751cdfa466923218ff59a8624fa8d1050b6fb (patch)
tree72acb1080a2a1ecc4be6f19d51e2718e179e8d52
parent7c4c32a2976e061f3cc9cecf54ad20dd8861a212 (diff)
net/mlx5: Don't unlock fte while still using it
commit 0fd758d6112f867b2cc6df0f6a856048ff99b211 upstream. 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: 0c56b97503fd ("net/mlx5_core: Introduce flow steering API") Signed-off-by: Mark Bloch <markb@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> Signed-off-by: Leon Romanovsky <leon@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/fs_core.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
index 914e5466f729..7e20e4bc4cc7 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
@@ -1110,9 +1110,8 @@ static struct mlx5_flow_rule *add_rule_fg(struct mlx5_flow_group *fg,
1110 return rule; 1110 return rule;
1111 } 1111 }
1112 rule = add_rule_fte(fte, fg, dest); 1112 rule = add_rule_fte(fte, fg, dest);
1113 unlock_ref_node(&fte->node);
1114 if (IS_ERR(rule)) 1113 if (IS_ERR(rule))
1115 goto unlock_fg; 1114 goto unlock_fte;
1116 else 1115 else
1117 goto add_rule; 1116 goto add_rule;
1118 } 1117 }
@@ -1130,6 +1129,7 @@ static struct mlx5_flow_rule *add_rule_fg(struct mlx5_flow_group *fg,
1130 goto unlock_fg; 1129 goto unlock_fg;
1131 } 1130 }
1132 tree_init_node(&fte->node, 0, del_fte); 1131 tree_init_node(&fte->node, 0, del_fte);
1132 nested_lock_ref_node(&fte->node, FS_MUTEX_CHILD);
1133 rule = add_rule_fte(fte, fg, dest); 1133 rule = add_rule_fte(fte, fg, dest);
1134 if (IS_ERR(rule)) { 1134 if (IS_ERR(rule)) {
1135 kfree(fte); 1135 kfree(fte);
@@ -1142,6 +1142,8 @@ static struct mlx5_flow_rule *add_rule_fg(struct mlx5_flow_group *fg,
1142 list_add(&fte->node.list, prev); 1142 list_add(&fte->node.list, prev);
1143add_rule: 1143add_rule:
1144 tree_add_node(&rule->node, &fte->node); 1144 tree_add_node(&rule->node, &fte->node);
1145unlock_fte:
1146 unlock_ref_node(&fte->node);
1145unlock_fg: 1147unlock_fg:
1146 unlock_ref_node(&fg->node); 1148 unlock_ref_node(&fg->node);
1147 return rule; 1149 return rule;