| From 0fd758d6112f867b2cc6df0f6a856048ff99b211 Mon Sep 17 00:00:00 2001 |
| From: Mark Bloch <markb@mellanox.com> |
| Date: Mon, 5 Sep 2016 10:58:04 +0000 |
| Subject: [PATCH] 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> |
| |
| 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, |
| return rule; |
| } |
| rule = add_rule_fte(fte, fg, dest); |
| - unlock_ref_node(&fte->node); |
| if (IS_ERR(rule)) |
| - goto unlock_fg; |
| + goto unlock_fte; |
| else |
| goto add_rule; |
| } |
| @@ -1127,6 +1126,7 @@ static struct mlx5_flow_rule *add_rule_fg(struct mlx5_flow_group *fg, |
| goto unlock_fg; |
| } |
| tree_init_node(&fte->node, 0, del_fte); |
| + nested_lock_ref_node(&fte->node, FS_MUTEX_CHILD); |
| rule = add_rule_fte(fte, fg, dest); |
| if (IS_ERR(rule)) { |
| kfree(fte); |
| @@ -1139,6 +1139,8 @@ static struct mlx5_flow_rule *add_rule_fg(struct mlx5_flow_group *fg, |
| list_add(&fte->node.list, prev); |
| add_rule: |
| tree_add_node(&rule->node, &fte->node); |
| +unlock_fte: |
| + unlock_ref_node(&fte->node); |
| unlock_fg: |
| unlock_ref_node(&fg->node); |
| return rule; |
| -- |
| 2.12.0 |
| |