]> 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>
Fri, 29 Nov 2019 09:07:37 +0000 (10:07 +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 3e99799bdb40c53104960aca0f0f97a04d7780e1..a6a64531bc438c67af97ec6e2d40889ca83b9a46 100644 (file)
@@ -549,7 +549,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,
@@ -1095,6 +1095,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;
 }
@@ -1297,8 +1299,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)
@@ -1325,7 +1326,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 c1252d6be0ef13f38fbe573e724b0a814f319230..80906aff21d7c0af7490273b987a07924a2edfca 100644 (file)
@@ -137,6 +137,7 @@ struct mlx5_flow_table {
        struct {
                bool                    active;
                unsigned int            required_groups;
+               unsigned int            group_size;
                unsigned int            num_groups;
        } autogroup;
        /* Protect fwd_rules */