]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net/mlx5: Fix auto group size calculation
authorMaor Gottlieb <maorg@mellanox.com>
Thu, 5 Sep 2019 06:56:10 +0000 (09:56 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 1 Dec 2019 08:16:08 +0000 (09:16 +0100)
[ Upstream commit 97fd8da281f80e7e69e0114bc906575734d4dfaf ]

Once all the large flow groups (defined by the user when the flow table
is created - max_num_groups) were created, then all the following new
flow groups will have only one flow table entry, even though the flow table
has place to larger groups.
Fix the condition to prefer large flow group.

Fixes: f0d22d187473 ("net/mlx5_core: Introduce flow steering autogrouped flow table")
Signed-off-by: Maor Gottlieb <maorg@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
drivers/net/ethernet/mellanox/mlx5/core/fs_core.h

index c079f85593d6086bfdbf5e7c985e7cd34ecfdcdc..82a53317285d0d181f1d4baffc85563920986be1 100644 (file)
@@ -520,7 +520,7 @@ static void del_sw_flow_group(struct fs_node *node)
 
        rhashtable_destroy(&fg->ftes_hash);
        ida_destroy(&fg->fte_allocator);
-       if (ft->autogroup.active)
+       if (ft->autogroup.active && fg->max_ftes == ft->autogroup.group_size)
                ft->autogroup.num_groups--;
        err = rhltable_remove(&ft->fgs_hash,
                              &fg->hash,
@@ -1065,6 +1065,8 @@ mlx5_create_auto_grouped_flow_table(struct mlx5_flow_namespace *ns,
 
        ft->autogroup.active = true;
        ft->autogroup.required_groups = max_num_groups;
+       /* We save place for flow groups in addition to max types */
+       ft->autogroup.group_size = ft->max_fte / (max_num_groups + 1);
 
        return ft;
 }
@@ -1270,8 +1272,7 @@ static struct mlx5_flow_group *alloc_auto_flow_group(struct mlx5_flow_table  *ft
                return ERR_PTR(-ENOENT);
 
        if (ft->autogroup.num_groups < ft->autogroup.required_groups)
-               /* We save place for flow groups in addition to max types */
-               group_size = ft->max_fte / (ft->autogroup.required_groups + 1);
+               group_size = ft->autogroup.group_size;
 
        /*  ft->max_fte == ft->autogroup.max_types */
        if (group_size == 0)
@@ -1298,7 +1299,8 @@ static struct mlx5_flow_group *alloc_auto_flow_group(struct mlx5_flow_table  *ft
        if (IS_ERR(fg))
                goto out;
 
-       ft->autogroup.num_groups++;
+       if (group_size == ft->autogroup.group_size)
+               ft->autogroup.num_groups++;
 
 out:
        return fg;
index 32070e5d993d856d0c560e9adde78b3e86d928bf..ba62fbce23a2100ce4144e5b59ad2dba68c0325a 100644 (file)
@@ -121,6 +121,7 @@ struct mlx5_flow_table {
        struct {
                bool                    active;
                unsigned int            required_groups;
+               unsigned int            group_size;
                unsigned int            num_groups;
        } autogroup;
        /* Protect fwd_rules */