From: Roman Gushchin <roman.gushchin@linux.dev>
To: Shakeel Butt <shakeel.butt@linux.dev>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Johannes Weiner <hannes@cmpxchg.org>,
Michal Hocko <mhocko@kernel.org>,
Muchun Song <muchun.song@linux.dev>,
Vlastimil Babka <vbabka@suse.cz>,
Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
linux-mm@kvack.org, cgroups@vger.kernel.org,
linux-kernel@vger.kernel.org,
Meta kernel team <kernel-team@meta.com>
Subject: Re: [PATCH 8/9] memcg: combine slab obj stock charging and accounting
Date: Tue, 18 Mar 2025 01:20:09 +0000 [thread overview]
Message-ID: <Z9jKSZpr41hcrqvD@google.com> (raw)
In-Reply-To: <20250315174930.1769599-9-shakeel.butt@linux.dev>
On Sat, Mar 15, 2025 at 10:49:29AM -0700, Shakeel Butt wrote:
> From: Vlastimil Babka <vbabka@suse.cz>
>
> When handing slab objects, we use obj_cgroup_[un]charge() for
> (un)charging and mod_objcg_state() to account NR_SLAB_[UN]RECLAIMABLE_B.
> All these operations use the percpu stock for performance. However with
> the calls being separate, the stock_lock is taken twice in each case.
>
> By refactoring the code, we can turn mod_objcg_state() into
> __account_obj_stock() which is called on a stock that's already locked
> and validated. On the charging side we can call this function from
> consume_obj_stock() when it succeeds, and refill_obj_stock() in the
> fallback. We just expand parameters of these functions as necessary.
> The uncharge side from __memcg_slab_free_hook() is just the call to
> refill_obj_stock().
>
> Other callers of obj_cgroup_[un]charge() (i.e. not slab) simply pass the
> extra parameters as NULL/zeroes to skip the __account_obj_stock()
> operation.
>
> In __memcg_slab_post_alloc_hook() we now charge each object separately,
> but that's not a problem as we did call mod_objcg_state() for each
> object separately, and most allocations are non-bulk anyway. This
> could be improved by batching all operations until slab_pgdat(slab)
> changes.
>
> Some preliminary benchmarking with a kfree(kmalloc()) loop of 10M
> iterations with/without __GFP_ACCOUNT:
>
> Before the patch:
> kmalloc/kfree !memcg: 581390144 cycles
> kmalloc/kfree memcg: 783689984 cycles
>
> After the patch:
> kmalloc/kfree memcg: 658723808 cycles
>
> More than half of the overhead of __GFP_ACCOUNT relative to
> non-accounted case seems eliminated.
Oh, this is huge!
I believe the next step is to also integrate the refcnt management,
it might shave off few more percent.
Reviewed-by: Roman Gushchin <roman.gushchin@linux.dev>
next prev parent reply other threads:[~2025-03-18 1:20 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-15 17:49 [PATCH 0/9] memcg: cleanup per-cpu stock Shakeel Butt
2025-03-15 17:49 ` [PATCH 1/9] memcg: remove root memcg check from refill_stock Shakeel Butt
2025-03-18 0:39 ` Roman Gushchin
2025-03-18 7:59 ` Vlastimil Babka
2025-03-21 16:55 ` Shakeel Butt
2025-03-15 17:49 ` [PATCH 2/9] memcg: decouple drain_obj_stock from local stock Shakeel Butt
2025-03-18 0:44 ` Roman Gushchin
2025-03-15 17:49 ` [PATCH 3/9] memcg: introduce memcg_uncharge Shakeel Butt
2025-03-18 0:50 ` Roman Gushchin
2025-03-15 17:49 ` [PATCH 4/9] memcg: manually inline __refill_stock Shakeel Butt
2025-03-18 0:58 ` Roman Gushchin
2025-03-18 7:58 ` Vlastimil Babka
2025-03-15 17:49 ` [PATCH 5/9] memcg: no refilling stock from obj_cgroup_release Shakeel Butt
2025-03-18 1:06 ` Roman Gushchin
2025-03-15 17:49 ` [PATCH 6/9] memcg: do obj_cgroup_put inside drain_obj_stock Shakeel Butt
2025-03-18 1:07 ` Roman Gushchin
2025-03-15 17:49 ` [PATCH 7/9] memcg: use __mod_memcg_state in drain_obj_stock Shakeel Butt
2025-03-17 20:56 ` Vlastimil Babka
2025-03-17 21:54 ` Shakeel Butt
2025-03-18 8:02 ` Vlastimil Babka
2025-03-18 1:13 ` Roman Gushchin
2025-03-18 7:50 ` Vlastimil Babka
2025-03-15 17:49 ` [PATCH 8/9] memcg: combine slab obj stock charging and accounting Shakeel Butt
2025-03-18 1:20 ` Roman Gushchin [this message]
2025-03-15 17:49 ` [PATCH 9/9] memcg: manually inline replace_stock_objcg Shakeel Butt
2025-03-18 1:21 ` Roman Gushchin
2025-03-18 8:00 ` Vlastimil Babka
2025-03-16 3:57 ` [PATCH 0/9] memcg: cleanup per-cpu stock Andrew Morton
2025-03-16 4:43 ` Shakeel Butt
2025-03-16 15:59 ` Alexei Starovoitov
2025-03-17 18:11 ` Shakeel Butt
2025-03-17 20:27 ` Andrew Morton
2025-04-02 20:40 ` Shakeel Butt
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=Z9jKSZpr41hcrqvD@google.com \
--to=roman.gushchin@linux.dev \
--cc=akpm@linux-foundation.org \
--cc=bigeasy@linutronix.de \
--cc=cgroups@vger.kernel.org \
--cc=hannes@cmpxchg.org \
--cc=kernel-team@meta.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@kernel.org \
--cc=muchun.song@linux.dev \
--cc=shakeel.butt@linux.dev \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox