diff options
author | Mark Bloch <markb@mellanox.com> | 2016-09-05 06:58:04 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-02-18 09:11:43 -0500 |
commit | 0e0751cdfa466923218ff59a8624fa8d1050b6fb (patch) | |
tree | 72acb1080a2a1ecc4be6f19d51e2718e179e8d52 | |
parent | 7c4c32a2976e061f3cc9cecf54ad20dd8861a212 (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.c | 6 |
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); |
1143 | add_rule: | 1143 | add_rule: |
1144 | tree_add_node(&rule->node, &fte->node); | 1144 | tree_add_node(&rule->node, &fte->node); |
1145 | unlock_fte: | ||
1146 | unlock_ref_node(&fte->node); | ||
1145 | unlock_fg: | 1147 | unlock_fg: |
1146 | unlock_ref_node(&fg->node); | 1148 | unlock_ref_node(&fg->node); |
1147 | return rule; | 1149 | return rule; |