memory cgroup enhancements: add memory.stat file
Show accounted information of memory cgroup by memory.stat file [akpm@linux-foundation.org: coding-style fixes] [akpm@linux-foundation.org: fix printk warning] Signed-off-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp> Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Balbir Singh <balbir@linux.vnet.ibm.com> Cc: Pavel Emelianov <xemul@openvz.org> Cc: Paul Menage <menage@google.com> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: "Eric W. Biederman" <ebiederm@xmission.com> Cc: Nick Piggin <nickpiggin@yahoo.com.au> Cc: Kirill Korotaev <dev@sw.ru> Cc: Herbert Poetzl <herbert@13thfloor.at> Cc: David Rientjes <rientjes@google.com> Cc: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.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
d52aa412d4
commit
d2ceb9b7dd
|
@ -29,6 +29,7 @@
|
|||
#include <linux/swap.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
|
@ -794,6 +795,49 @@ static ssize_t mem_force_empty_read(struct cgroup *cont,
|
|||
}
|
||||
|
||||
|
||||
static const struct mem_cgroup_stat_desc {
|
||||
const char *msg;
|
||||
u64 unit;
|
||||
} mem_cgroup_stat_desc[] = {
|
||||
[MEM_CGROUP_STAT_CACHE] = { "cache", PAGE_SIZE, },
|
||||
[MEM_CGROUP_STAT_RSS] = { "rss", PAGE_SIZE, },
|
||||
};
|
||||
|
||||
static int mem_control_stat_show(struct seq_file *m, void *arg)
|
||||
{
|
||||
struct cgroup *cont = m->private;
|
||||
struct mem_cgroup *mem_cont = mem_cgroup_from_cont(cont);
|
||||
struct mem_cgroup_stat *stat = &mem_cont->stat;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(stat->cpustat[0].count); i++) {
|
||||
s64 val;
|
||||
|
||||
val = mem_cgroup_read_stat(stat, i);
|
||||
val *= mem_cgroup_stat_desc[i].unit;
|
||||
seq_printf(m, "%s %lld\n", mem_cgroup_stat_desc[i].msg,
|
||||
(long long)val);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct file_operations mem_control_stat_file_operations = {
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static int mem_control_stat_open(struct inode *unused, struct file *file)
|
||||
{
|
||||
/* XXX __d_cont */
|
||||
struct cgroup *cont = file->f_dentry->d_parent->d_fsdata;
|
||||
|
||||
file->f_op = &mem_control_stat_file_operations;
|
||||
return single_open(file, mem_control_stat_show, cont);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static struct cftype mem_cgroup_files[] = {
|
||||
{
|
||||
.name = "usage_in_bytes",
|
||||
|
@ -821,6 +865,10 @@ static struct cftype mem_cgroup_files[] = {
|
|||
.write = mem_force_empty_write,
|
||||
.read = mem_force_empty_read,
|
||||
},
|
||||
{
|
||||
.name = "stat",
|
||||
.open = mem_control_stat_open,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mem_cgroup init_mem_cgroup;
|
||||
|
|
Loading…
Reference in New Issue