]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
maple_tree: replace preallocation with slub percpu array prefill
authorVlastimil Babka <vbabka@suse.cz>
Mon, 7 Aug 2023 21:00:36 +0000 (23:00 +0200)
committerVlastimil Babka <vbabka@suse.cz>
Thu, 25 Jan 2024 10:02:10 +0000 (11:02 +0100)
With the percpu array we can try not doing the preallocations in maple
tree, and instead make sure the percpu array is prefilled, and using
GFP_ATOMIC in places that relied on the preallocation (in case we miss
or fail trylock on the array), i.e. mas_store_prealloc(). For now simply
add __GFP_NOFAIL there as well.

lib/maple_tree.c

index 1591f3917b7e63eaa1f2183862f320dca6e7e5ff..b21c53cb085d28a5cb86665dde464ffefc00d183 100644 (file)
@@ -5428,7 +5428,12 @@ void mas_store_prealloc(struct ma_state *mas, void *entry)
 
        mas_wr_store_setup(&wr_mas);
        trace_ma_write(__func__, mas, 0, entry);
+
+retry:
        mas_wr_store_entry(&wr_mas);
+       if (unlikely(mas_nomem(mas, GFP_ATOMIC | __GFP_NOFAIL)))
+               goto retry;
+
        MAS_WR_BUG_ON(&wr_mas, mas_is_err(mas));
        mas_destroy(mas);
 }
@@ -5447,8 +5452,6 @@ int mas_preallocate(struct ma_state *mas, void *entry, gfp_t gfp)
        MA_WR_STATE(wr_mas, mas, entry);
        unsigned char node_size;
        int request = 1;
-       int ret;
-
 
        if (unlikely(!mas->index && mas->last == ULONG_MAX))
                goto ask_now;
@@ -5499,16 +5502,8 @@ int mas_preallocate(struct ma_state *mas, void *entry, gfp_t gfp)
 
        /* node store, slot store needs one node */
 ask_now:
-       mas_node_count_gfp(mas, request, gfp);
-       if (likely(!mas_is_err(mas)))
-               return 0;
+       return kmem_cache_prefill_percpu_array(maple_node_cache, request, gfp);
 
-       mas_set_alloc_req(mas, 0);
-       ret = xa_err(mas->node);
-       mas_reset(mas);
-       mas_destroy(mas);
-       mas_reset(mas);
-       return ret;
 }
 EXPORT_SYMBOL_GPL(mas_preallocate);