From: Paul Blakey <pa...@mellanox.com>

Currently, if one thread tries to add an entry to an autogrouped table
with no free matching group, while another thread is in the process of
creating a new matching autogroup, it doesn't wait for the new group
creation, and creates an unnecessary new autogroup.

Instead of skipping inactive, wait on the write lock of those groups.

Signed-off-by: Paul Blakey <pa...@mellanox.com>
Reviewed-by: Roi Dayan <r...@mellanox.com>
Reviewed-by: Mark Bloch <ma...@mellanox.com>
Reviewed-by: Maor Gottlieb <ma...@mellanox.com>
Signed-off-by: Saeed Mahameed <sae...@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c 
b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
index 2da45e9b9b6d..52af6023a4b4 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
@@ -1755,11 +1755,13 @@ try_add_to_existing_fg(struct mlx5_flow_table *ft,
        list_for_each_entry(iter, match_head, list) {
                g = iter->g;
 
-               if (!g->node.active)
-                       continue;
-
                nested_down_write_ref_node(&g->node, FS_LOCK_PARENT);
 
+               if (!g->node.active) {
+                       up_write_ref_node(&g->node, false);
+                       continue;
+               }
+
                err = insert_fte(g, fte);
                if (err) {
                        up_write_ref_node(&g->node, false);
-- 
2.25.4

Reply via email to