]> git.karo-electronics.de Git - linux-beck.git/commitdiff
net/mlx5: Don't unlock fte while still using it
authorMark Bloch <markb@mellanox.com>
Mon, 5 Sep 2016 10:58:04 +0000 (10:58 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 18 Feb 2017 14:11:43 +0000 (15:11 +0100)
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>
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c

index 914e5466f729b65d706dc97d553fd774c94fc436..7e20e4bc4cc7535c81a97eb55ffd2f58caf7ad6a 100644 (file)
@@ -1110,9 +1110,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;
                }
@@ -1130,6 +1129,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);
@@ -1142,6 +1142,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;