memcg: show real limit under hierarchy mode
Show "real" limit of memcg. This helps my debugging and maybe useful for users. While testing hierarchy like this mount -t cgroup none /cgroup -t memory mkdir /cgroup/A set use_hierarchy==1 to "A" mkdir /cgroup/A/01 mkdir /cgroup/A/01/02 mkdir /cgroup/A/01/03 mkdir /cgroup/A/01/03/04 mkdir /cgroup/A/08 mkdir /cgroup/A/08/01 .... and set each own limit to them, "real" limit of each memcg is unclear. This patch shows real limit by checking all ancestors. Changelog: (v1) -> (v2) - remove "if" and use "min(a,b)" Acked-by: Balbir Singh <balbir@linux.vnet.ibm.com> Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
c772be939e
commit
fee7b548e6
|
@ -1782,6 +1782,34 @@ static int mem_cgroup_write(struct cgroup *cont, struct cftype *cft,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void memcg_get_hierarchical_limit(struct mem_cgroup *memcg,
|
||||||
|
unsigned long long *mem_limit, unsigned long long *memsw_limit)
|
||||||
|
{
|
||||||
|
struct cgroup *cgroup;
|
||||||
|
unsigned long long min_limit, min_memsw_limit, tmp;
|
||||||
|
|
||||||
|
min_limit = res_counter_read_u64(&memcg->res, RES_LIMIT);
|
||||||
|
min_memsw_limit = res_counter_read_u64(&memcg->memsw, RES_LIMIT);
|
||||||
|
cgroup = memcg->css.cgroup;
|
||||||
|
if (!memcg->use_hierarchy)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
while (cgroup->parent) {
|
||||||
|
cgroup = cgroup->parent;
|
||||||
|
memcg = mem_cgroup_from_cont(cgroup);
|
||||||
|
if (!memcg->use_hierarchy)
|
||||||
|
break;
|
||||||
|
tmp = res_counter_read_u64(&memcg->res, RES_LIMIT);
|
||||||
|
min_limit = min(min_limit, tmp);
|
||||||
|
tmp = res_counter_read_u64(&memcg->memsw, RES_LIMIT);
|
||||||
|
min_memsw_limit = min(min_memsw_limit, tmp);
|
||||||
|
}
|
||||||
|
out:
|
||||||
|
*mem_limit = min_limit;
|
||||||
|
*memsw_limit = min_memsw_limit;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
static int mem_cgroup_reset(struct cgroup *cont, unsigned int event)
|
static int mem_cgroup_reset(struct cgroup *cont, unsigned int event)
|
||||||
{
|
{
|
||||||
struct mem_cgroup *mem;
|
struct mem_cgroup *mem;
|
||||||
|
@ -1855,6 +1883,13 @@ static int mem_control_stat_show(struct cgroup *cont, struct cftype *cft,
|
||||||
cb->fill(cb, "unevictable", unevictable * PAGE_SIZE);
|
cb->fill(cb, "unevictable", unevictable * PAGE_SIZE);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
unsigned long long limit, memsw_limit;
|
||||||
|
memcg_get_hierarchical_limit(mem_cont, &limit, &memsw_limit);
|
||||||
|
cb->fill(cb, "hierarchical_memory_limit", limit);
|
||||||
|
if (do_swap_account)
|
||||||
|
cb->fill(cb, "hierarchical_memsw_limit", memsw_limit);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_VM
|
#ifdef CONFIG_DEBUG_VM
|
||||||
cb->fill(cb, "inactive_ratio", calc_inactive_ratio(mem_cont, NULL));
|
cb->fill(cb, "inactive_ratio", calc_inactive_ratio(mem_cont, NULL));
|
||||||
|
|
Loading…
Reference in New Issue