All of lore.kernel.org
 help / color / mirror / Atom feed
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>

  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 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.