From: Huan Yang <link@vivo.com>
To: Johannes Weiner <hannes@cmpxchg.org>,
Michal Hocko <mhocko@kernel.org>,
Roman Gushchin <roman.gushchin@linux.dev>,
Shakeel Butt <shakeel.butt@linux.dev>,
Muchun Song <muchun.song@linux.dev>,
Andrew Morton <akpm@linux-foundation.org>,
Petr Mladek <pmladek@suse.com>, Vlastimil Babka <vbabka@suse.cz>,
Rasmus Villemoes <linux@rasmusvillemoes.dk>,
Francesco Valla <francesco@valla.it>,
Raul E Rangel <rrangel@chromium.org>,
"Paul E. McKenney" <paulmck@kernel.org>,
Huang Shijie <shijie@os.amperecomputing.com>,
Guo Weikang <guoweikang.kernel@gmail.com>,
"Uladzislau Rezki (Sony)" <urezki@gmail.com>,
KP Singh <kpsingh@kernel.org>,
cgroups@vger.kernel.org, linux-mm@kvack.org,
linux-kernel@vger.kernel.org, Huan Yang <link@vivo.com>
Cc: opensource.kernel@vivo.com
Subject: [PATCH v3 2/3] mm/memcg: use kmem_cache when alloc memcg
Date: Fri, 25 Apr 2025 11:19:24 +0800 [thread overview]
Message-ID: <20250425031935.76411-3-link@vivo.com> (raw)
In-Reply-To: <20250425031935.76411-1-link@vivo.com>
When tracing mem_cgroup_alloc() with kmalloc ftrace, we observe:
kmalloc: call_site=mem_cgroup_css_alloc+0xd8/0x5b4 ptr=000000003e4c3799
bytes_req=2312 bytes_alloc=4096 gfp_flags=GFP_KERNEL|__GFP_ZERO node=-1
accounted=false
The output indicates that while allocating mem_cgroup struct (2312 bytes),
the slab allocator actually provides 4096-byte chunks. This occurs because:
1. The slab allocator predefines bucket sizes from 64B to 8096B
2. The mem_cgroup allocation size (2312B) falls between the 2KB and 4KB
slabs
3. The allocator rounds up to the nearest larger slab (4KB), resulting in
~1KB wasted memory per allocation
This patch introduces a dedicated kmem_cache for mem_cgroup structs,
achieving precise memory allocation. Post-patch ftrace verification shows:
kmem_cache_alloc: call_site=mem_cgroup_css_alloc+0xbc/0x5d4
ptr=00000000695c1806 bytes_req=2312 bytes_alloc=2368
gfp_flags=GFP_KERNEL|__GFP_ZERO node=-1 accounted=false
Each memcg alloc offer 2368bytes(include hw cacheline align), compare to
4096, avoid waste.
Signed-off-by: Huan Yang <link@vivo.com>
---
mm/memcontrol.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 64a4213227c4..e34216e55688 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -95,6 +95,8 @@ static bool cgroup_memory_nokmem __ro_after_init;
/* BPF memory accounting disabled? */
static bool cgroup_memory_nobpf __ro_after_init;
+static struct kmem_cache *memcg_cachep;
+
#ifdef CONFIG_CGROUP_WRITEBACK
static DECLARE_WAIT_QUEUE_HEAD(memcg_cgwb_frn_waitq);
#endif
@@ -3652,7 +3654,7 @@ static struct mem_cgroup *mem_cgroup_alloc(struct mem_cgroup *parent)
int __maybe_unused i;
long error;
- memcg = kzalloc(struct_size(memcg, nodeinfo, nr_node_ids), GFP_KERNEL);
+ memcg = kmem_cache_zalloc(memcg_cachep, GFP_KERNEL);
if (!memcg)
return ERR_PTR(-ENOMEM);
@@ -5038,6 +5040,7 @@ __setup("cgroup.memory=", cgroup_memory);
*/
int __init mem_cgroup_init(void)
{
+ unsigned int memcg_size;
int cpu;
/*
@@ -5055,6 +5058,10 @@ int __init mem_cgroup_init(void)
INIT_WORK(&per_cpu_ptr(&memcg_stock, cpu)->work,
drain_local_stock);
+ memcg_size = struct_size_t(struct mem_cgroup, nodeinfo, nr_node_ids);
+ memcg_cachep = kmem_cache_create("mem_cgroup", memcg_size, 0,
+ SLAB_PANIC | SLAB_HWCACHE_ALIGN, NULL);
+
return 0;
}
--
2.48.1
next prev parent reply other threads:[~2025-04-25 3:19 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-25 3:19 [PATCH v3 0/3] Use kmem_cache for memcg alloc Huan Yang
2025-04-25 3:19 ` [PATCH v3 1/3] mm/memcg: move mem_cgroup_init() ahead of cgroup_init() Huan Yang
2025-04-25 4:11 ` Shakeel Butt
2025-04-28 2:20 ` Huan Yang
2025-04-27 11:46 ` Johannes Weiner
2025-04-28 2:20 ` Huan Yang
2025-04-25 3:19 ` Huan Yang [this message]
2025-04-25 4:12 ` [PATCH v3 2/3] mm/memcg: use kmem_cache when alloc memcg Shakeel Butt
2025-04-27 11:56 ` Johannes Weiner
2025-04-25 3:19 ` [PATCH v3 3/3] mm/memcg: use kmem_cache when alloc memcg pernode info Huan Yang
2025-04-25 4:12 ` Shakeel Butt
2025-04-27 12:00 ` Johannes Weiner
2025-04-25 4:35 ` [PATCH v3 0/3] Use kmem_cache for memcg alloc Matthew Wilcox
2025-04-28 2:19 ` Huan Yang
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=20250425031935.76411-3-link@vivo.com \
--to=link@vivo.com \
--cc=akpm@linux-foundation.org \
--cc=cgroups@vger.kernel.org \
--cc=francesco@valla.it \
--cc=guoweikang.kernel@gmail.com \
--cc=hannes@cmpxchg.org \
--cc=kpsingh@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux@rasmusvillemoes.dk \
--cc=mhocko@kernel.org \
--cc=muchun.song@linux.dev \
--cc=opensource.kernel@vivo.com \
--cc=paulmck@kernel.org \
--cc=pmladek@suse.com \
--cc=roman.gushchin@linux.dev \
--cc=rrangel@chromium.org \
--cc=shakeel.butt@linux.dev \
--cc=shijie@os.amperecomputing.com \
--cc=urezki@gmail.com \
--cc=vbabka@suse.cz \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.