]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
slub: Reflow ___slab_alloc()
authorChengming Zhou <zhouchengming@bytedance.com>
Sun, 7 Sep 2025 14:56:27 +0000 (10:56 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 9 Sep 2025 16:56:34 +0000 (18:56 +0200)
[ Upstream commit 24c6a097b5a270e05c6e99a99da66b91be81fd7d ]

The get_partial() interface used in ___slab_alloc() may return a single
object in the "kmem_cache_debug(s)" case, in which we will just return
the "freelist" object.

Move this handling up to prepare for later changes.

And the "pfmemalloc_match()" part is not needed for node partial slab,
since we already check this in the get_partial_node().

Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com>
Reviewed-by: Vlastimil Babka <vbabka@suse.cz>
Tested-by: Hyeonggon Yoo <42.hyeyoo@gmail.com>
Reviewed-by: Hyeonggon Yoo <42.hyeyoo@gmail.com>
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
Stable-dep-of: 850470a8413a ("mm: slub: avoid wake up kswapd in set_track_prepare")
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
mm/slub.c

index 391f9db1c8f38134dbcf0ef583fab9ae114bf707..b2fb63ebfda1c387cb1d6d0118139fb4e2169721 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -3228,8 +3228,21 @@ new_objects:
        pc.slab = &slab;
        pc.orig_size = orig_size;
        freelist = get_partial(s, node, &pc);
-       if (freelist)
-               goto check_new_slab;
+       if (freelist) {
+               if (kmem_cache_debug(s)) {
+                       /*
+                        * For debug caches here we had to go through
+                        * alloc_single_from_partial() so just store the
+                        * tracking info and return the object.
+                        */
+                       if (s->flags & SLAB_STORE_USER)
+                               set_track(s, freelist, TRACK_ALLOC, addr);
+
+                       return freelist;
+               }
+
+               goto retry_load_slab;
+       }
 
        slub_put_cpu_ptr(s->cpu_slab);
        slab = new_slab(s, gfpflags, node);
@@ -3265,20 +3278,6 @@ new_objects:
 
        inc_slabs_node(s, slab_nid(slab), slab->objects);
 
-check_new_slab:
-
-       if (kmem_cache_debug(s)) {
-               /*
-                * For debug caches here we had to go through
-                * alloc_single_from_partial() so just store the tracking info
-                * and return the object
-                */
-               if (s->flags & SLAB_STORE_USER)
-                       set_track(s, freelist, TRACK_ALLOC, addr);
-
-               return freelist;
-       }
-
        if (unlikely(!pfmemalloc_match(slab, gfpflags))) {
                /*
                 * For !pfmemalloc_match() case we don't load freelist so that