]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
net/mlx5: Do not hold group lock while allocating FTE in software
authorParav Pandit <parav@mellanox.com>
Thu, 19 Sep 2019 22:22:19 +0000 (17:22 -0500)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 1 Nov 2019 21:55:15 +0000 (14:55 -0700)
FTE memory allocation using alloc_fte() doesn't have any dependency
on the flow group.
Hence, do not hold flow group lock while performing alloc_fte().
This helps to reduce contention of flow group lock.

Signed-off-by: Parav Pandit <parav@mellanox.com>
Reviewed-by: Daniel Jurgens <danielj@mellanox.com>
Reviewed-by: Mark Bloch <markb@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c

index 3bbb49354829a6f36efab13e1420feefd73b907c..e5591f4f19b78b6f64fb180dc735f243abbe5eb9 100644 (file)
@@ -1814,6 +1814,13 @@ _mlx5_add_flow_rules(struct mlx5_flow_table *ft,
                return rule;
        }
 
+       fte = alloc_fte(ft, spec, flow_act);
+       if (IS_ERR(fte)) {
+               up_write_ref_node(&ft->node, false);
+               err = PTR_ERR(fte);
+               goto err_alloc_fte;
+       }
+
        nested_down_write_ref_node(&g->node, FS_LOCK_PARENT);
        up_write_ref_node(&ft->node, false);
 
@@ -1821,17 +1828,9 @@ _mlx5_add_flow_rules(struct mlx5_flow_table *ft,
        if (err)
                goto err_release_fg;
 
-       fte = alloc_fte(ft, spec, flow_act);
-       if (IS_ERR(fte)) {
-               err = PTR_ERR(fte);
-               goto err_release_fg;
-       }
-
        err = insert_fte(g, fte);
-       if (err) {
-               kmem_cache_free(steering->ftes_cache, fte);
+       if (err)
                goto err_release_fg;
-       }
 
        nested_down_write_ref_node(&fte->node, FS_LOCK_CHILD);
        up_write_ref_node(&g->node, false);
@@ -1843,6 +1842,8 @@ _mlx5_add_flow_rules(struct mlx5_flow_table *ft,
 
 err_release_fg:
        up_write_ref_node(&g->node, false);
+       kmem_cache_free(steering->ftes_cache, fte);
+err_alloc_fte:
        tree_put_node(&g->node, false);
        return ERR_PTR(err);
 }