From: Joshua Hahn <joshua.hahnjy@gmail.com>
To: Dennis Zhou <dennis@kernel.org>, Tejun Heo <tj@kernel.org>,
Christoph Lameter <cl@gentwo.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Harry Yoo <harry@kernel.org>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
kernel-team@meta.com
Subject: [PATCH v2] mm/percpu: clean up callers of pcpu_obj_full_size()
Date: Tue, 20 Oct 2026 19:30:11 -0700 [thread overview]
Message-ID: <20261021023011.3199331-1-joshua.hahnjy@gmail.com> (raw)
The size of a pcpu allocation can be interpreted in two ways:
1. The size of the allocation attributable to a single CPU.
2. The total size of the allocation across all CPUs, including the
allocation overhead (for obj_cgroup membership).
In most accounting paths for percpu memory, we need the second
definition (full size). Make this more obvious by coalescing the
callers of pcpu_obj_full_size() and renaming the parameter to full_size
to distinguish between the two definitions above.
No functional changes intended.
Signed-off-by: Joshua Hahn <joshua.hahnjy@gmail.com>
---
v1 --> v2
- Renamed the function parameter from size to full_size where
appropriate now that pcpu_obj_full_size(size) is passed in, as
suggested by Harry Yoo.
- Wordsmithing.
mm/percpu.c | 63 +++++++++++++++++++++++++++++------------------------
1 file changed, 34 insertions(+), 29 deletions(-)
diff --git a/mm/percpu.c b/mm/percpu.c
index d7883507dc151..b22a16980f646 100644
--- a/mm/percpu.c
+++ b/mm/percpu.c
@@ -1611,7 +1611,7 @@ static struct pcpu_chunk *pcpu_chunk_addr_search(void *addr)
}
#ifdef CONFIG_MEMCG
-static bool pcpu_memcg_pre_alloc_hook(size_t size, gfp_t gfp,
+static bool pcpu_memcg_pre_alloc_hook(size_t full_size, gfp_t gfp,
struct obj_cgroup **objcgp)
{
struct obj_cgroup *objcg;
@@ -1623,7 +1623,7 @@ static bool pcpu_memcg_pre_alloc_hook(size_t size, gfp_t gfp,
if (!objcg || obj_cgroup_is_root(objcg))
return true;
- if (obj_cgroup_charge(objcg, gfp, pcpu_obj_full_size(size)))
+ if (obj_cgroup_charge(objcg, gfp, full_size))
return false;
*objcgp = objcg;
@@ -1632,7 +1632,7 @@ static bool pcpu_memcg_pre_alloc_hook(size_t size, gfp_t gfp,
static void pcpu_memcg_post_alloc_hook(struct obj_cgroup *objcg,
struct pcpu_chunk *chunk, int off,
- size_t size)
+ size_t full_size)
{
if (!objcg)
return;
@@ -1643,14 +1643,15 @@ static void pcpu_memcg_post_alloc_hook(struct obj_cgroup *objcg,
rcu_read_lock();
mod_memcg_state(obj_cgroup_memcg(objcg), MEMCG_PERCPU_B,
- pcpu_obj_full_size(size));
+ full_size);
rcu_read_unlock();
} else {
- obj_cgroup_uncharge(objcg, pcpu_obj_full_size(size));
+ obj_cgroup_uncharge(objcg, full_size);
}
}
-static void pcpu_memcg_free_hook(struct pcpu_chunk *chunk, int off, size_t size)
+static void pcpu_memcg_free_hook(struct pcpu_chunk *chunk, int off,
+ size_t full_size)
{
struct obj_cgroup *objcg;
@@ -1662,57 +1663,59 @@ static void pcpu_memcg_free_hook(struct pcpu_chunk *chunk, int off, size_t size)
return;
chunk->obj_exts[off >> PCPU_MIN_ALLOC_SHIFT].cgroup = NULL;
- obj_cgroup_uncharge(objcg, pcpu_obj_full_size(size));
+ obj_cgroup_uncharge(objcg, full_size);
rcu_read_lock();
- mod_memcg_state(obj_cgroup_memcg(objcg), MEMCG_PERCPU_B,
- -pcpu_obj_full_size(size));
+ mod_memcg_state(obj_cgroup_memcg(objcg), MEMCG_PERCPU_B, -full_size);
rcu_read_unlock();
obj_cgroup_put(objcg);
}
#else /* CONFIG_MEMCG */
-static bool
-pcpu_memcg_pre_alloc_hook(size_t size, gfp_t gfp, struct obj_cgroup **objcgp)
+static bool pcpu_memcg_pre_alloc_hook(size_t full_size, gfp_t gfp,
+ struct obj_cgroup **objcgp)
{
return true;
}
static void pcpu_memcg_post_alloc_hook(struct obj_cgroup *objcg,
struct pcpu_chunk *chunk, int off,
- size_t size)
+ size_t full_size)
{
}
-static void pcpu_memcg_free_hook(struct pcpu_chunk *chunk, int off, size_t size)
+static void pcpu_memcg_free_hook(struct pcpu_chunk *chunk, int off,
+ size_t full_size)
{
}
#endif /* CONFIG_MEMCG */
#ifdef CONFIG_MEM_ALLOC_PROFILING
static void pcpu_alloc_tag_alloc_hook(struct pcpu_chunk *chunk, int off,
- size_t size)
+ size_t full_size)
{
if (mem_alloc_profiling_enabled() && likely(chunk->obj_exts)) {
alloc_tag_add(&chunk->obj_exts[off >> PCPU_MIN_ALLOC_SHIFT].tag,
- current->alloc_tag, pcpu_obj_full_size(size));
+ current->alloc_tag, full_size);
}
}
-static void pcpu_alloc_tag_free_hook(struct pcpu_chunk *chunk, int off, size_t size)
+static void pcpu_alloc_tag_free_hook(struct pcpu_chunk *chunk, int off,
+ size_t full_size)
{
if (mem_alloc_profiling_enabled() && likely(chunk->obj_exts))
alloc_tag_sub(&chunk->obj_exts[off >> PCPU_MIN_ALLOC_SHIFT].tag,
- pcpu_obj_full_size(size));
+ full_size);
}
#else
static void pcpu_alloc_tag_alloc_hook(struct pcpu_chunk *chunk, int off,
- size_t size)
+ size_t full_size)
{
}
-static void pcpu_alloc_tag_free_hook(struct pcpu_chunk *chunk, int off, size_t size)
+static void pcpu_alloc_tag_free_hook(struct pcpu_chunk *chunk, int off,
+ size_t full_size)
{
}
#endif
@@ -1744,7 +1747,7 @@ void __percpu *pcpu_alloc_noprof(size_t size, size_t align, bool reserved,
int slot, off, cpu, ret;
unsigned long flags;
void __percpu *ptr;
- size_t bits, bit_align;
+ size_t bits, bit_align, full_size;
gfp = current_gfp_context(gfp);
/*
@@ -1773,6 +1776,7 @@ void __percpu *pcpu_alloc_noprof(size_t size, size_t align, bool reserved,
size = ALIGN(size, PCPU_MIN_ALLOC_SIZE);
bits = size >> PCPU_MIN_ALLOC_SHIFT;
bit_align = align >> PCPU_MIN_ALLOC_SHIFT;
+ full_size = pcpu_obj_full_size(size);
if (unlikely(!size || size > PCPU_MIN_UNIT_SIZE || align > PAGE_SIZE ||
!is_power_of_2(align))) {
@@ -1781,7 +1785,7 @@ void __percpu *pcpu_alloc_noprof(size_t size, size_t align, bool reserved,
return NULL;
}
- if (unlikely(!pcpu_memcg_pre_alloc_hook(size, gfp, &objcg)))
+ if (unlikely(!pcpu_memcg_pre_alloc_hook(full_size, gfp, &objcg)))
return NULL;
if (!is_atomic) {
@@ -1793,7 +1797,7 @@ void __percpu *pcpu_alloc_noprof(size_t size, size_t align, bool reserved,
if (gfp & __GFP_NOFAIL) {
mutex_lock(&pcpu_alloc_mutex);
} else if (mutex_lock_killable(&pcpu_alloc_mutex)) {
- pcpu_memcg_post_alloc_hook(objcg, NULL, 0, size);
+ pcpu_memcg_post_alloc_hook(objcg, NULL, 0, full_size);
return NULL;
}
}
@@ -1903,12 +1907,11 @@ void __percpu *pcpu_alloc_noprof(size_t size, size_t align, bool reserved,
kmemleak_alloc_percpu(ptr, size, gfp);
trace_percpu_alloc_percpu(_RET_IP_, reserved, is_atomic, size, align,
- chunk->base_addr, off, ptr,
- pcpu_obj_full_size(size), gfp);
+ chunk->base_addr, off, ptr, full_size, gfp);
- pcpu_memcg_post_alloc_hook(objcg, chunk, off, size);
+ pcpu_memcg_post_alloc_hook(objcg, chunk, off, full_size);
- pcpu_alloc_tag_alloc_hook(chunk, off, size);
+ pcpu_alloc_tag_alloc_hook(chunk, off, full_size);
return ptr;
@@ -1938,7 +1941,7 @@ void __percpu *pcpu_alloc_noprof(size_t size, size_t align, bool reserved,
mutex_unlock(&pcpu_alloc_mutex);
}
- pcpu_memcg_post_alloc_hook(objcg, NULL, 0, size);
+ pcpu_memcg_post_alloc_hook(objcg, NULL, 0, full_size);
return NULL;
}
@@ -2242,6 +2245,7 @@ void free_percpu(void __percpu *ptr)
struct pcpu_chunk *chunk;
unsigned long flags;
int size, off;
+ size_t full_size;
bool need_balance = false;
if (!ptr)
@@ -2262,10 +2266,11 @@ void free_percpu(void __percpu *ptr)
WARN_ON_ONCE(1);
return;
}
+ full_size = pcpu_obj_full_size(size);
- pcpu_alloc_tag_free_hook(chunk, off, size);
+ pcpu_alloc_tag_free_hook(chunk, off, full_size);
- pcpu_memcg_free_hook(chunk, off, size);
+ pcpu_memcg_free_hook(chunk, off, full_size);
/*
* If there are more than one fully free chunks, wake up grim reaper.
--
2.53.0-Meta
next reply other threads:[~2026-10-21 2:30 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-21 2:30 Joshua Hahn [this message]
2026-10-21 9:47 ` Harry Yoo
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=20261021023011.3199331-1-joshua.hahnjy@gmail.com \
--to=joshua.hahnjy@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=cl@gentwo.org \
--cc=dennis@kernel.org \
--cc=harry@kernel.org \
--cc=kernel-team@meta.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=tj@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
all inboxes | Powered by JetHome®