]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
slub: keep empty main sheaf as spare in __pcs_replace_empty_main()
authorHao Li <haolee.swjtu@gmail.com>
Wed, 10 Dec 2025 00:26:31 +0000 (08:26 +0800)
committerVlastimil Babka <vbabka@suse.cz>
Tue, 27 Jan 2026 17:03:19 +0000 (18:03 +0100)
When __pcs_replace_empty_main() fails to obtain a full sheaf directly
from the barn, it may either:

  - Refill an empty sheaf obtained via barn_get_empty_sheaf(), or
  - Allocate a brand new full sheaf via alloc_full_sheaf().

After reacquiring the per-CPU lock, if pcs->main is still empty and
pcs->spare is NULL, the current code donates the empty main sheaf to
the barn via barn_put_empty_sheaf() and installs the full sheaf as
pcs->main, leaving pcs->spare unpopulated.

Instead, keep the existing empty main sheaf locally as the spare:

  pcs->spare = pcs->main;
  pcs->main = full;

This populates pcs->spare earlier, which can reduce future barn traffic.

Suggested-by: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: Hao Li <haolee.swjtu@gmail.com>
Reviewed-by: Harry Yoo <harry.yoo@oracle.com>
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
Tested-by: Zhao Liu <zhao1.liu@intel.com>
mm/slub.c

index afc3e511ff395993a082b754532ffcaa7257035e..e90f3e558ae7d291990f836f6a344200c11dcd8d 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -5049,7 +5049,10 @@ __pcs_replace_empty_main(struct kmem_cache *s, struct slub_percpu_sheaves *pcs,
         */
 
        if (pcs->main->size == 0) {
-               barn_put_empty_sheaf(barn, pcs->main);
+               if (!pcs->spare)
+                       pcs->spare = pcs->main;
+               else
+                       barn_put_empty_sheaf(barn, pcs->main);
                pcs->main = full;
                return pcs;
        }