On Thu, Feb 04, 2016 at 03:45:40PM -0500, Johannes Weiner wrote: > On Thu, Feb 04, 2016 at 04:03:37PM +0300, Vladimir Davydov wrote: > > Currently, tree_{stat,events} helpers can only get one stat index at a > > time, so when there are a lot of stats to be reported one has to call it > > over and over again (see memory_stat_show). This is neither effective, > > nor does it look good. Instead, let's make these helpers take a snapshot > > of all available counters. > > > > Signed-off-by: Vladimir Davydov <vdavydov@xxxxxxxxxxxxx> > > This looks much better, and most of the callstacks involved here are > very flat, so the increased stack consumption should be alright. > > The only exception there is the threshold code, which can happen from > the direct reclaim path and thus with a fairly deep stack already. Yeah, I missed this case. Thought mem_cgroup_usage is only used for reporting to userspace. Thanks for catching this. > > Would it be better to leave mem_cgroup_usage() alone, open-code it, > and then use tree_stat() and tree_events() only for v2 memory.stat? > Definitely. diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 59f74074c04c..4f2afb9a2d67 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -2745,14 +2745,20 @@ static void tree_events(struct mem_cgroup *memcg, unsigned long *events) static unsigned long mem_cgroup_usage(struct mem_cgroup *memcg, bool swap) { - unsigned long stat[MEMCG_NR_STAT]; - unsigned long val; + unsigned long val = 0; if (mem_cgroup_is_root(memcg)) { - tree_stat(memcg, stat); - val = stat[MEM_CGROUP_STAT_CACHE] + stat[MEM_CGROUP_STAT_RSS]; - if (swap) - val += stat[MEM_CGROUP_STAT_SWAP]; + struct mem_cgroup *iter; + + for_each_mem_cgroup_tree(iter, memcg) { + val += mem_cgroup_read_stat(iter, + MEM_CGROUP_STAT_CACHE); + val += mem_cgroup_read_stat(iter, + MEM_CGROUP_STAT_RSS); + if (swap) + val += mem_cgroup_read_stat(iter, + MEM_CGROUP_STAT_SWAP); + } } else { if (!swap) val = page_counter_read(&memcg->memory); -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>