From: Hao Li <hao.li@linux.dev>
To: vbabka@kernel.org, harry@kernel.org, akpm@linux-foundation.org
Cc: cl@gentwo.org, rientjes@google.com, roman.gushchin@linux.dev,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
Hao Li <hao.li@linux.dev>
Subject: [PATCH] mm/slub: allocate sheaves on local memory nodes
Date: Mon, 25 May 2026 16:13:47 +0800 [thread overview]
Message-ID: <20260525082312.16012-1-hao.li@linux.dev> (raw)
Sheaves are per-CPU allocator metadata and their object arrays are accessed
from the local fast paths. Allocate them with a NUMA node hint instead of
using plain kzalloc(). While no measurable performance improvement was
observed, this approach is theoretically correct.
During bootstrap we allocate sheaves for all possible CPUs before every
possible CPU has an initialized cpu_to_mem() value, so compute the
memory node from local_memory_node(cpu_to_node(cpu)) just like
what __build_all_zonelists does.
Signed-off-by: Hao Li <hao.li@linux.dev>
---
This patch might conflict with Shengming's patch. Let's review it first, and if
it looks good, I'll rebase afterwards. Thanks.
mm/slub.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/mm/slub.c b/mm/slub.c
index 180973a4a3d2..ff1b1e932719 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -2757,7 +2757,7 @@ static inline void *setup_object(struct kmem_cache *s, void *object)
}
static struct slab_sheaf *__alloc_empty_sheaf(struct kmem_cache *s, gfp_t gfp,
- unsigned int capacity)
+ unsigned int capacity, int node)
{
struct slab_sheaf *sheaf;
size_t sheaf_size;
@@ -2776,7 +2776,7 @@ static struct slab_sheaf *__alloc_empty_sheaf(struct kmem_cache *s, gfp_t gfp,
gfp |= __GFP_NO_OBJ_EXT;
sheaf_size = struct_size(sheaf, objects, capacity);
- sheaf = kzalloc(sheaf_size, gfp);
+ sheaf = kzalloc_node(sheaf_size, gfp, node);
if (unlikely(!sheaf))
return NULL;
@@ -2791,7 +2791,7 @@ static struct slab_sheaf *__alloc_empty_sheaf(struct kmem_cache *s, gfp_t gfp,
static inline struct slab_sheaf *alloc_empty_sheaf(struct kmem_cache *s,
gfp_t gfp)
{
- return __alloc_empty_sheaf(s, gfp, s->sheaf_capacity);
+ return __alloc_empty_sheaf(s, gfp, s->sheaf_capacity, numa_mem_id());
}
static void free_empty_sheaf(struct kmem_cache *s, struct slab_sheaf *sheaf)
@@ -8413,10 +8413,17 @@ static void __init bootstrap_cache_sheaves(struct kmem_cache *s)
for_each_possible_cpu(cpu) {
struct slub_percpu_sheaves *pcs;
+ int mem_node;
pcs = per_cpu_ptr(s->cpu_sheaves, cpu);
- pcs->main = __alloc_empty_sheaf(s, GFP_KERNEL, capacity);
+ /*
+ * Cannot use cpu_to_mem() here because it's only initialized
+ * for online CPUs at this point (see __build_all_zonelists),
+ * while we need to allocate sheaves for all possible CPUs.
+ */
+ mem_node = local_memory_node(cpu_to_node(cpu));
+ pcs->main = __alloc_empty_sheaf(s, GFP_KERNEL, capacity, mem_node);
if (!pcs->main) {
failed = true;
--
2.54.0
next reply other threads:[~2026-05-25 8:23 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-25 8:13 Hao Li [this message]
2026-05-26 6:56 ` [PATCH] mm/slub: allocate sheaves on local memory nodes Harry Yoo
2026-05-26 7:59 ` Hao Li
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260525082312.16012-1-hao.li@linux.dev \
--to=hao.li@linux.dev \
--cc=akpm@linux-foundation.org \
--cc=cl@gentwo.org \
--cc=harry@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=rientjes@google.com \
--cc=roman.gushchin@linux.dev \
--cc=vbabka@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox