memcg: extract mem_group_usage() from mem_cgroup_read()
Helper to get memory or mem+swap usage of the cgroup. Signed-off-by: Kirill A. Shutemov <kirill@shutemov.name> Acked-by: Balbir Singh <balbir@linux.vnet.ibm.com> Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Li Zefan <lizf@cn.fujitsu.com> Cc: Pavel Emelyanov <xemul@openvz.org> Cc: Dan Malek <dan@embeddedalley.com> Cc: Vladislav Buzov <vbuzov@embeddedalley.com> Cc: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> Cc: Alexander Shishkin <virtuoso@slind.org> Cc: Davide Libenzi <davidel@xmailserver.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
0dea116876
Коммит
104f39284e
|
@ -2857,40 +2857,50 @@ mem_cgroup_get_recursive_idx_stat(struct mem_cgroup *mem,
|
|||
*val = d.val;
|
||||
}
|
||||
|
||||
static inline u64 mem_cgroup_usage(struct mem_cgroup *mem, bool swap)
|
||||
{
|
||||
u64 idx_val, val;
|
||||
|
||||
if (!mem_cgroup_is_root(mem)) {
|
||||
if (!swap)
|
||||
return res_counter_read_u64(&mem->res, RES_USAGE);
|
||||
else
|
||||
return res_counter_read_u64(&mem->memsw, RES_USAGE);
|
||||
}
|
||||
|
||||
mem_cgroup_get_recursive_idx_stat(mem, MEM_CGROUP_STAT_CACHE, &idx_val);
|
||||
val = idx_val;
|
||||
mem_cgroup_get_recursive_idx_stat(mem, MEM_CGROUP_STAT_RSS, &idx_val);
|
||||
val += idx_val;
|
||||
|
||||
if (swap) {
|
||||
mem_cgroup_get_recursive_idx_stat(mem,
|
||||
MEM_CGROUP_STAT_SWAPOUT, &idx_val);
|
||||
val += idx_val;
|
||||
}
|
||||
|
||||
return val << PAGE_SHIFT;
|
||||
}
|
||||
|
||||
static u64 mem_cgroup_read(struct cgroup *cont, struct cftype *cft)
|
||||
{
|
||||
struct mem_cgroup *mem = mem_cgroup_from_cont(cont);
|
||||
u64 idx_val, val;
|
||||
u64 val;
|
||||
int type, name;
|
||||
|
||||
type = MEMFILE_TYPE(cft->private);
|
||||
name = MEMFILE_ATTR(cft->private);
|
||||
switch (type) {
|
||||
case _MEM:
|
||||
if (name == RES_USAGE && mem_cgroup_is_root(mem)) {
|
||||
mem_cgroup_get_recursive_idx_stat(mem,
|
||||
MEM_CGROUP_STAT_CACHE, &idx_val);
|
||||
val = idx_val;
|
||||
mem_cgroup_get_recursive_idx_stat(mem,
|
||||
MEM_CGROUP_STAT_RSS, &idx_val);
|
||||
val += idx_val;
|
||||
val <<= PAGE_SHIFT;
|
||||
} else
|
||||
if (name == RES_USAGE)
|
||||
val = mem_cgroup_usage(mem, false);
|
||||
else
|
||||
val = res_counter_read_u64(&mem->res, name);
|
||||
break;
|
||||
case _MEMSWAP:
|
||||
if (name == RES_USAGE && mem_cgroup_is_root(mem)) {
|
||||
mem_cgroup_get_recursive_idx_stat(mem,
|
||||
MEM_CGROUP_STAT_CACHE, &idx_val);
|
||||
val = idx_val;
|
||||
mem_cgroup_get_recursive_idx_stat(mem,
|
||||
MEM_CGROUP_STAT_RSS, &idx_val);
|
||||
val += idx_val;
|
||||
mem_cgroup_get_recursive_idx_stat(mem,
|
||||
MEM_CGROUP_STAT_SWAPOUT, &idx_val);
|
||||
val += idx_val;
|
||||
val <<= PAGE_SHIFT;
|
||||
} else
|
||||
if (name == RES_USAGE)
|
||||
val = mem_cgroup_usage(mem, true);
|
||||
else
|
||||
val = res_counter_read_u64(&mem->memsw, name);
|
||||
break;
|
||||
default:
|
||||
|
|
Загрузка…
Ссылка в новой задаче