mm, slub: extract get_partial() from new_slab_objects()
authorVlastimil Babka <vbabka@suse.cz>
Tue, 11 May 2021 10:45:48 +0000 (12:45 +0200)
committerVlastimil Babka <vbabka@suse.cz>
Fri, 3 Sep 2021 23:12:20 +0000 (01:12 +0200)
The later patches will need more fine grained control over individual actions
in ___slab_alloc(), the only caller of new_slab_objects(), so this is a first
preparatory step with no functional change.

This adds a goto label that appears unnecessary at this point, but will be
useful for later changes.

Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
Acked-by: Christoph Lameter <cl@linux.com>
mm/slub.c

index 79e5330..cd6aeee 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -2613,17 +2613,12 @@ slab_out_of_memory(struct kmem_cache *s, gfp_t gfpflags, int nid)
 static inline void *new_slab_objects(struct kmem_cache *s, gfp_t flags,
                        int node, struct kmem_cache_cpu **pc)
 {
-       void *freelist;
+       void *freelist = NULL;
        struct kmem_cache_cpu *c = *pc;
        struct page *page;
 
        WARN_ON_ONCE(s->ctor && (flags & __GFP_ZERO));
 
-       freelist = get_partial(s, flags, node, c);
-
-       if (freelist)
-               return freelist;
-
        page = new_slab(s, flags, node);
        if (page) {
                c = raw_cpu_ptr(s->cpu_slab);
@@ -2787,6 +2782,10 @@ new_slab:
                goto redo;
        }
 
+       freelist = get_partial(s, gfpflags, node, c);
+       if (freelist)
+               goto check_new_page;
+
        freelist = new_slab_objects(s, gfpflags, node, &c);
 
        if (unlikely(!freelist)) {
@@ -2794,6 +2793,7 @@ new_slab:
                return NULL;
        }
 
+check_new_page:
        page = c->page;
        if (likely(!kmem_cache_debug(s) && pfmemalloc_match(page, gfpflags)))
                goto load_freelist;