diff options
author | Mark Bloch <markb@mellanox.com> | 2016-09-05 06:58:04 -0400 |
---|---|---|
committer | Leon Romanovsky <leon@kernel.org> | 2016-10-30 09:43:14 -0400 |
commit | 0fd758d6112f867b2cc6df0f6a856048ff99b211 (patch) | |
tree | 476fe30fe410fa518c6847067ae798926f97b8d3 | |
parent | bd77bf1cb595477528f06f5c52f913f70acd73bb (diff) |
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: 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>
-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 5da2cc878582..a07ff305b44f 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | |||
@@ -1107,9 +1107,8 @@ static struct mlx5_flow_rule *add_rule_fg(struct mlx5_flow_group *fg, | |||
1107 | return rule; | 1107 | return rule; |
1108 | } | 1108 | } |
1109 | rule = add_rule_fte(fte, fg, dest); | 1109 | rule = add_rule_fte(fte, fg, dest); |
1110 | unlock_ref_node(&fte->node); | ||
1111 | if (IS_ERR(rule)) | 1110 | if (IS_ERR(rule)) |
1112 | goto unlock_fg; | 1111 | goto unlock_fte; |
1113 | else | 1112 | else |
1114 | goto add_rule; | 1113 | goto add_rule; |
1115 | } | 1114 | } |
@@ -1127,6 +1126,7 @@ static struct mlx5_flow_rule *add_rule_fg(struct mlx5_flow_group *fg, | |||
1127 | goto unlock_fg; | 1126 | goto unlock_fg; |
1128 | } | 1127 | } |
1129 | tree_init_node(&fte->node, 0, del_fte); | 1128 | tree_init_node(&fte->node, 0, del_fte); |
1129 | nested_lock_ref_node(&fte->node, FS_MUTEX_CHILD); | ||
1130 | rule = add_rule_fte(fte, fg, dest); | 1130 | rule = add_rule_fte(fte, fg, dest); |
1131 | if (IS_ERR(rule)) { | 1131 | if (IS_ERR(rule)) { |
1132 | kfree(fte); | 1132 | kfree(fte); |
@@ -1139,6 +1139,8 @@ static struct mlx5_flow_rule *add_rule_fg(struct mlx5_flow_group *fg, | |||
1139 | list_add(&fte->node.list, prev); | 1139 | list_add(&fte->node.list, prev); |
1140 | add_rule: | 1140 | add_rule: |
1141 | tree_add_node(&rule->node, &fte->node); | 1141 | tree_add_node(&rule->node, &fte->node); |
1142 | unlock_fte: | ||
1143 | unlock_ref_node(&fte->node); | ||
1142 | unlock_fg: | 1144 | unlock_fg: |
1143 | unlock_ref_node(&fg->node); | 1145 | unlock_ref_node(&fg->node); |
1144 | return rule; | 1146 | return rule; |