net/mlx5: Simplify matching group searches
authorEli Cohen <eli@mellanox.com>
Wed, 26 Feb 2020 13:03:16 +0000 (15:03 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Thu, 26 Mar 2020 06:19:04 +0000 (23:19 -0700)
Instead of using two different structs for searching groups with the
same match, use a single struct and thus simplify the code, make it more
readable and smaller size which means less code cache misses.

         text    data     bss     dec     hex
before: 35524    2744       0   38268    957c
after:  35038    2744       0   37782    9396

When testing add 70000 rules, delete all the rules, and repeat three
times taking the average, we get (time in seconds):

Before the change: insert 16.80, delete 11.02
After the change:  insert 16.55, delete 10.95

Signed-off-by: Eli Cohen <eli@mellanox.com>
Reviewed-by: Mark Bloch <markb@mellanox.com>
Reviewed-by: Maor Gottlieb <maorg@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c

index c93bd55fab0658f0706b63d9ceb9703b71cf45d6..a9ec40ca78936ef95e5df6cae0ec5d63f4e3720d 100644 (file)
@@ -1577,28 +1577,19 @@ struct match_list {
        struct mlx5_flow_group *g;
 };
 
-struct match_list_head {
-       struct list_head  list;
-       struct match_list first;
-};
-
-static void free_match_list(struct match_list_head *head, bool ft_locked)
+static void free_match_list(struct match_list *head, bool ft_locked)
 {
-       if (!list_empty(&head->list)) {
-               struct match_list *iter, *match_tmp;
+       struct match_list *iter, *match_tmp;
 
-               list_del(&head->first.list);
-               tree_put_node(&head->first.g->node, ft_locked);
-               list_for_each_entry_safe(iter, match_tmp, &head->list,
-                                        list) {
-                       tree_put_node(&iter->g->node, ft_locked);
-                       list_del(&iter->list);
-                       kfree(iter);
-               }
+       list_for_each_entry_safe(iter, match_tmp, &head->list,
+                                list) {
+               tree_put_node(&iter->g->node, ft_locked);
+               list_del(&iter->list);
+               kfree(iter);
        }
 }
 
-static int build_match_list(struct match_list_head *match_head,
+static int build_match_list(struct match_list *match_head,
                            struct mlx5_flow_table *ft,
                            const struct mlx5_flow_spec *spec,
                            bool ft_locked)
@@ -1615,14 +1606,8 @@ static int build_match_list(struct match_list_head *match_head,
        rhl_for_each_entry_rcu(g, tmp, list, hash) {
                struct match_list *curr_match;
 
-               if (likely(list_empty(&match_head->list))) {
-                       if (!tree_get_node(&g->node))
-                               continue;
-                       match_head->first.g = g;
-                       list_add_tail(&match_head->first.list,
-                                     &match_head->list);
+               if (unlikely(!tree_get_node(&g->node)))
                        continue;
-               }
 
                curr_match = kmalloc(sizeof(*curr_match), GFP_ATOMIC);
                if (!curr_match) {
@@ -1630,10 +1615,6 @@ static int build_match_list(struct match_list_head *match_head,
                        err = -ENOMEM;
                        goto out;
                }
-               if (!tree_get_node(&g->node)) {
-                       kfree(curr_match);
-                       continue;
-               }
                curr_match->g = g;
                list_add_tail(&curr_match->list, &match_head->list);
        }
@@ -1785,9 +1766,9 @@ _mlx5_add_flow_rules(struct mlx5_flow_table *ft,
 
 {
        struct mlx5_flow_steering *steering = get_steering(&ft->node);
-       struct mlx5_flow_group *g;
        struct mlx5_flow_handle *rule;
-       struct match_list_head match_head;
+       struct match_list match_head;
+       struct mlx5_flow_group *g;
        bool take_write = false;
        struct fs_fte *fte;
        int version;