From: Roman Gushchin <guro@fb.com>
To: Vlastimil Babka <vbabka@suse.cz>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Johannes Weiner <hannes@cmpxchg.org>,
Michal Hocko <mhocko@kernel.org>, <linux-mm@kvack.org>,
<kernel-team@fb.com>, <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v3 03/19] mm: memcg: convert vmstat slab counters to bytes
Date: Wed, 20 May 2020 12:26:52 -0700 [thread overview]
Message-ID: <20200520192652.GA278395@carbon.dhcp.thefacebook.com> (raw)
In-Reply-To: <b72ff85a-22aa-f55d-41ee-2ddee00674a7@suse.cz>
On Wed, May 20, 2020 at 02:25:22PM +0200, Vlastimil Babka wrote:
> On 4/22/20 10:46 PM, Roman Gushchin wrote:
> > In order to prepare for per-object slab memory accounting, convert
> > NR_SLAB_RECLAIMABLE and NR_SLAB_UNRECLAIMABLE vmstat items to bytes.
> >
> > To make it obvious, rename them to NR_SLAB_RECLAIMABLE_B and
> > NR_SLAB_UNRECLAIMABLE_B (similar to NR_KERNEL_STACK_KB).
> >
> > Internally global and per-node counters are stored in pages,
> > however memcg and lruvec counters are stored in bytes.
> > This scheme may look weird, but only for now. As soon as slab
> > pages will be shared between multiple cgroups, global and
> > node counters will reflect the total number of slab pages.
> > However memcg and lruvec counters will be used for per-memcg
> > slab memory tracking, which will take separate kernel objects
> > in the account. Keeping global and node counters in pages helps
> > to avoid additional overhead.
> >
> > The size of slab memory shouldn't exceed 4Gb on 32-bit machines,
> > so it will fit into atomic_long_t we use for vmstats.
> >
> > Signed-off-by: Roman Gushchin <guro@fb.com>
> > ---
> > drivers/base/node.c | 4 ++--
> > fs/proc/meminfo.c | 4 ++--
> > include/linux/mmzone.h | 16 +++++++++++++---
> > kernel/power/snapshot.c | 2 +-
> > mm/memcontrol.c | 11 ++++-------
> > mm/oom_kill.c | 2 +-
> > mm/page_alloc.c | 8 ++++----
> > mm/slab.h | 15 ++++++++-------
> > mm/slab_common.c | 4 ++--
> > mm/slob.c | 12 ++++++------
> > mm/slub.c | 8 ++++----
> > mm/vmscan.c | 3 ++-
> > mm/workingset.c | 6 ++++--
> > 13 files changed, 53 insertions(+), 42 deletions(-)
>
>
> > @@ -206,7 +206,17 @@ enum node_stat_item {
> >
> > static __always_inline bool vmstat_item_in_bytes(enum node_stat_item item)
> > {
> > - return false;
> > + /*
> > + * Global and per-node slab counters track slab pages.
> > + * It's expected that changes are multiples of PAGE_SIZE.
> > + * Internally values are stored in pages.
> > + *
> > + * Per-memcg and per-lruvec counters track memory, consumed
> > + * by individual slab objects. These counters are actually
> > + * byte-precise.
> > + */
> > + return (item == NR_SLAB_RECLAIMABLE_B ||
> > + item == NR_SLAB_UNRECLAIMABLE_B);
Hello, Vlastimil!
Thank you for looking into the patchset, appreciate it.
In the next version I'll add some comments based on your suggestions in previous
letters.
> > }
>
> Ok, so this is no longer a no-op, but __always_inline here and inline in
> global_node_page_state() should hopefully mean that for all users of
> global_node_page_state(<constant>) the compiler will eliminate the branch for
> non-slab counters. But there are also functions such as si_mem_available() that
> use non-constant item. Maybe compiler is smart enough anyway, but perhaps it's
> better to use global_node_page_state_pages() in such callers?
I'll take a look, thanks for the idea.
>
> However __mod_node_page_state() and mode_node_state() will now branch always. I
> wonder if the "API clean" goal is worth it...
You mean just adding a special write-side helper which will perform a conversion
and put VM_WARN_ON_ONCE() into generic write-side helpers?
>
> > --- a/mm/memcontrol.c
> > +++ b/mm/memcontrol.c
> > @@ -1409,9 +1409,8 @@ static char *memory_stat_format(struct mem_cgroup *memcg)
> > (u64)memcg_page_state(memcg, MEMCG_KERNEL_STACK_KB) *
> > 1024);
> > seq_buf_printf(&s, "slab %llu\n",
> > - (u64)(memcg_page_state(memcg, NR_SLAB_RECLAIMABLE) +
> > - memcg_page_state(memcg, NR_SLAB_UNRECLAIMABLE)) *
> > - PAGE_SIZE);
> > + (u64)(memcg_page_state(memcg, NR_SLAB_RECLAIMABLE_B) +
> > + memcg_page_state(memcg, NR_SLAB_UNRECLAIMABLE_B)));
> > seq_buf_printf(&s, "sock %llu\n",
> > (u64)memcg_page_state(memcg, MEMCG_SOCK) *
> > PAGE_SIZE);
> > @@ -1445,11 +1444,9 @@ static char *memory_stat_format(struct mem_cgroup *memcg)
> > PAGE_SIZE);
> >
> > seq_buf_printf(&s, "slab_reclaimable %llu\n",
> > - (u64)memcg_page_state(memcg, NR_SLAB_RECLAIMABLE) *
> > - PAGE_SIZE);
> > + (u64)memcg_page_state(memcg, NR_SLAB_RECLAIMABLE_B));
> > seq_buf_printf(&s, "slab_unreclaimable %llu\n",
> > - (u64)memcg_page_state(memcg, NR_SLAB_UNRECLAIMABLE) *
> > - PAGE_SIZE);
> > + (u64)memcg_page_state(memcg, NR_SLAB_UNRECLAIMABLE_B));
>
> So here we are now printing in bytes instead of pages, right? That's fine for
> OOM report, but in sysfs aren't we breaking existing users?
>
Hm, but it was in bytes previously, look at that x * PAGE_SIZE.
Or do you mean that now it can be not rounded to PAGE_SIZE?
If so, I don't think it breaks any expectations.
Thanks!
next prev parent reply other threads:[~2020-05-20 19:27 UTC|newest]
Thread overview: 84+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-22 20:46 [PATCH v3 00/19] The new cgroup slab memory controller Roman Gushchin
2020-04-22 20:46 ` [PATCH v3 01/19] mm: memcg: factor out memcg- and lruvec-level changes out of __mod_lruvec_state() Roman Gushchin
2020-05-07 20:33 ` Johannes Weiner
2020-05-20 10:49 ` Vlastimil Babka
2020-04-22 20:46 ` [PATCH v3 02/19] mm: memcg: prepare for byte-sized vmstat items Roman Gushchin
2020-05-07 20:34 ` Johannes Weiner
2020-05-20 11:31 ` Vlastimil Babka
2020-05-20 11:36 ` Vlastimil Babka
2020-04-22 20:46 ` [PATCH v3 03/19] mm: memcg: convert vmstat slab counters to bytes Roman Gushchin
2020-05-07 20:41 ` Johannes Weiner
2020-05-20 12:25 ` Vlastimil Babka
2020-05-20 19:26 ` Roman Gushchin [this message]
2020-05-21 9:57 ` Vlastimil Babka
2020-05-21 21:14 ` Roman Gushchin
2020-04-22 20:46 ` [PATCH v3 04/19] mm: slub: implement SLUB version of obj_to_index() Roman Gushchin
2020-04-22 23:52 ` Christopher Lameter
2020-04-23 0:05 ` Roman Gushchin
2020-04-25 2:10 ` Christopher Lameter
2020-04-25 2:46 ` Roman Gushchin
2020-04-27 16:21 ` Christopher Lameter
2020-04-27 16:46 ` Roman Gushchin
2020-04-28 17:06 ` Roman Gushchin
2020-04-28 17:45 ` Johannes Weiner
2020-04-30 16:29 ` Christopher Lameter
2020-04-30 17:15 ` Roman Gushchin
2020-05-02 23:54 ` Christopher Lameter
2020-05-04 18:29 ` Roman Gushchin
2020-05-08 21:35 ` Christopher Lameter
2020-05-13 0:57 ` Roman Gushchin
2020-05-15 21:45 ` Christopher Lameter
2020-05-15 22:12 ` Roman Gushchin
2020-05-20 9:51 ` Vlastimil Babka
2020-05-20 20:57 ` Roman Gushchin
2020-05-15 20:02 ` Roman Gushchin
2020-04-23 21:01 ` Roman Gushchin
2020-04-25 2:10 ` Christopher Lameter
2020-05-20 13:51 ` Vlastimil Babka
2020-05-20 21:00 ` Roman Gushchin
2020-05-21 11:01 ` Vlastimil Babka
2020-05-21 21:06 ` Roman Gushchin
2020-04-22 20:46 ` [PATCH v3 05/19] mm: memcontrol: decouple reference counting from page accounting Roman Gushchin
2020-04-22 20:46 ` [PATCH v3 06/19] mm: memcg/slab: obj_cgroup API Roman Gushchin
2020-05-07 21:03 ` Johannes Weiner
2020-05-07 22:26 ` Roman Gushchin
2020-05-12 22:56 ` Johannes Weiner
2020-05-15 22:01 ` Roman Gushchin
2020-04-22 20:46 ` [PATCH v3 07/19] mm: memcg/slab: allocate obj_cgroups for non-root slab pages Roman Gushchin
2020-04-23 20:20 ` Roman Gushchin
2020-05-22 18:27 ` Vlastimil Babka
2020-05-23 1:32 ` Roman Gushchin
2020-05-26 17:50 ` Roman Gushchin
2020-05-25 14:46 ` Vlastimil Babka
2020-04-22 20:46 ` [PATCH v3 08/19] mm: memcg/slab: save obj_cgroup for non-root slab objects Roman Gushchin
2020-05-25 15:07 ` Vlastimil Babka
2020-05-26 17:53 ` Roman Gushchin
2020-05-27 11:03 ` Vlastimil Babka
2020-04-22 20:46 ` [PATCH v3 09/19] mm: memcg/slab: charge individual slab objects instead of pages Roman Gushchin
2020-05-25 16:10 ` Vlastimil Babka
2020-05-26 18:04 ` Roman Gushchin
2020-04-22 20:46 ` [PATCH v3 10/19] mm: memcg/slab: deprecate memory.kmem.slabinfo Roman Gushchin
2020-05-07 21:05 ` Johannes Weiner
2020-04-22 20:47 ` [PATCH v3 11/19] mm: memcg/slab: move memcg_kmem_bypass() to memcontrol.h Roman Gushchin
2020-05-25 17:03 ` Vlastimil Babka
2020-04-22 20:47 ` [PATCH v3 12/19] mm: memcg/slab: use a single set of kmem_caches for all accounted allocations Roman Gushchin
2020-05-26 10:12 ` Vlastimil Babka
2020-04-22 20:47 ` [PATCH v3 13/19] mm: memcg/slab: simplify memcg cache creation Roman Gushchin
2020-05-26 10:31 ` Vlastimil Babka
2020-04-22 20:47 ` [PATCH v3 14/19] mm: memcg/slab: deprecate memcg_kmem_get_cache() Roman Gushchin
2020-05-26 10:34 ` Vlastimil Babka
2020-04-22 20:47 ` [PATCH v3 15/19] mm: memcg/slab: deprecate slab_root_caches Roman Gushchin
2020-05-26 10:52 ` Vlastimil Babka
2020-05-26 18:50 ` Roman Gushchin
2020-04-22 20:47 ` [PATCH v3 16/19] mm: memcg/slab: remove redundant check in memcg_accumulate_slabinfo() Roman Gushchin
2020-05-26 11:31 ` Vlastimil Babka
2020-04-22 20:47 ` [PATCH v3 17/19] mm: memcg/slab: use a single set of kmem_caches for all allocations Roman Gushchin
2020-05-26 14:55 ` Vlastimil Babka
2020-05-27 8:35 ` Jesper Dangaard Brouer
2020-04-22 20:47 ` [PATCH v3 18/19] kselftests: cgroup: add kernel memory accounting tests Roman Gushchin
2020-05-26 15:24 ` Vlastimil Babka
2020-05-26 15:45 ` Roman Gushchin
2020-05-27 17:00 ` Vlastimil Babka
2020-05-27 20:45 ` Roman Gushchin
2020-04-22 20:47 ` [PATCH v3 19/19] tools/cgroup: add memcg_slabinfo.py tool Roman Gushchin
2020-05-05 15:59 ` Tejun Heo
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=20200520192652.GA278395@carbon.dhcp.thefacebook.com \
--to=guro@fb.com \
--cc=akpm@linux-foundation.org \
--cc=hannes@cmpxchg.org \
--cc=kernel-team@fb.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@kernel.org \
--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;
as well as URLs for NNTP newsgroup(s).