Message ID | 1603722395-72443-1-git-send-email-zhongjiang-ali@linux.alibaba.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | mm: memcontrol: correct the NR_ANON_THPS counter of hierarchical memcg | expand |
On Mon, Oct 26, 2020 at 10:26:35PM +0800, zhongjiang-ali wrote: > memcg_page_state will get the specified number in hierarchical memcg, > It should multiply by HPAGE_PMD_NR rather than an page if the item is > NR_ANON_THPS. > > Fixes: 468c398233da ("mm: memcontrol: switch to native NR_ANON_THPS counter") > Signed-off-by: zhongjiang-ali <zhongjiang-ali@linux.alibaba.com> Acked-by: Johannes Weiner <hannes@cmpxchg.org>
On Mon 26-10-20 22:26:35, zhongjiang-ali wrote: > memcg_page_state will get the specified number in hierarchical memcg, > It should multiply by HPAGE_PMD_NR rather than an page if the item is > NR_ANON_THPS. I am not sure which tree are you looking at but the current Linus tree already does have this hunk. > Fixes: 468c398233da ("mm: memcontrol: switch to native NR_ANON_THPS counter") > Signed-off-by: zhongjiang-ali <zhongjiang-ali@linux.alibaba.com> > --- > mm/memcontrol.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index 3a24e3b..c27898e 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -4110,11 +4110,17 @@ static int memcg_stat_show(struct seq_file *m, void *v) > (u64)memsw * PAGE_SIZE); > > for (i = 0; i < ARRAY_SIZE(memcg1_stats); i++) { > + unsigned long nr; > + > if (memcg1_stats[i] == MEMCG_SWAP && !do_memsw_account()) > continue; > + nr = memcg_page_state(memcg, memcg1_stats[i]); > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE > + if (memcg1_stats[i] == NR_ANON_THPS) > + nr *= HPAGE_PMD_NR; > +#endif > seq_printf(m, "total_%s %llu\n", memcg1_stat_names[i], > - (u64)memcg_page_state(memcg, memcg1_stats[i]) * > - PAGE_SIZE); > + nr * PAGE_SIZE); > } > > for (i = 0; i < ARRAY_SIZE(memcg1_events); i++) > -- > 1.8.3.1
On Mon, Oct 26, 2020 at 03:47:57PM +0100, Michal Hocko wrote: > On Mon 26-10-20 22:26:35, zhongjiang-ali wrote: > > memcg_page_state will get the specified number in hierarchical memcg, > > It should multiply by HPAGE_PMD_NR rather than an page if the item is > > NR_ANON_THPS. > > I am not sure which tree are you looking at but the current Linus tree > already does have this hunk. This tripped up my pattern matching as well. You go to the code and you see this bit already there. But it's only there for the local stats, not the hierarchical stats, and the code for them is nearly identical - except "%s" vs "total_%s" and memcg_page_state_local() vs memcg_page_state(). Zhongjiang is updating the hierarchical stats a few lines below where you see that hunk.
On Mon 26-10-20 12:31:33, Johannes Weiner wrote: > On Mon, Oct 26, 2020 at 03:47:57PM +0100, Michal Hocko wrote: > > On Mon 26-10-20 22:26:35, zhongjiang-ali wrote: > > > memcg_page_state will get the specified number in hierarchical memcg, > > > It should multiply by HPAGE_PMD_NR rather than an page if the item is > > > NR_ANON_THPS. > > > > I am not sure which tree are you looking at but the current Linus tree > > already does have this hunk. > > This tripped up my pattern matching as well. You go to the code and > you see this bit already there. But it's only there for the local > stats, not the hierarchical stats, and the code for them is nearly > identical - except "%s" vs "total_%s" and memcg_page_state_local() vs > memcg_page_state(). You are right! Completely missed the total part. Thanks! My bad! > Zhongjiang is updating the hierarchical stats a few lines below where > you see that hunk. Acked-by: Michal Hocko <mhocko@suse.com>
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 3a24e3b..c27898e 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -4110,11 +4110,17 @@ static int memcg_stat_show(struct seq_file *m, void *v) (u64)memsw * PAGE_SIZE); for (i = 0; i < ARRAY_SIZE(memcg1_stats); i++) { + unsigned long nr; + if (memcg1_stats[i] == MEMCG_SWAP && !do_memsw_account()) continue; + nr = memcg_page_state(memcg, memcg1_stats[i]); +#ifdef CONFIG_TRANSPARENT_HUGEPAGE + if (memcg1_stats[i] == NR_ANON_THPS) + nr *= HPAGE_PMD_NR; +#endif seq_printf(m, "total_%s %llu\n", memcg1_stat_names[i], - (u64)memcg_page_state(memcg, memcg1_stats[i]) * - PAGE_SIZE); + nr * PAGE_SIZE); } for (i = 0; i < ARRAY_SIZE(memcg1_events); i++)
memcg_page_state will get the specified number in hierarchical memcg, It should multiply by HPAGE_PMD_NR rather than an page if the item is NR_ANON_THPS. Fixes: 468c398233da ("mm: memcontrol: switch to native NR_ANON_THPS counter") Signed-off-by: zhongjiang-ali <zhongjiang-ali@linux.alibaba.com> --- mm/memcontrol.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)