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)
        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) {
                        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);
        }
 
 {
        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;