memcgroup: implement failcounter reset
Pavel Emelyanov [Tue, 29 Apr 2008 08:00:21 +0000 (01:00 -0700)]
This is a very common requirement from people using the resource accounting
facilities (not only memcgroup but also OpenVZ beancounters).  They want to
put the cgroup in an initial state without re-creating it.

For example after re-configuring a group people want to observe how this new
configuration fits the group needs without saving the previous failcnt value.

Merge two resets into one mem_cgroup_reset() function to demonstrate how
multiplexing work.

Besides, I have plans to move the files, that correspond to res_counter to the
res_counter.c file and somehow "import" them into controller.  I don't know
how to make it gracefully yet, but merging resets of max_usage and failcnt in
one function will be there for sure.

[akpm@linux-foundation.org: coding-style fixes]
Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Balbir Singh <balbir@in.ibm.com>
Cc: Paul Menage <menage@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

include/linux/res_counter.h
mm/memcontrol.c

index 629d0ea..6d9e1fc 100644 (file)
@@ -143,4 +143,12 @@ static inline void res_counter_reset_max(struct res_counter *cnt)
        spin_unlock_irqrestore(&cnt->lock, flags);
 }
 
+static inline void res_counter_reset_failcnt(struct res_counter *cnt)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&cnt->lock, flags);
+       cnt->failcnt = 0;
+       spin_unlock_irqrestore(&cnt->lock, flags);
+}
 #endif
index dc3472f..f891876 100644 (file)
@@ -857,12 +857,19 @@ static ssize_t mem_cgroup_write(struct cgroup *cont, struct cftype *cft,
                                mem_cgroup_write_strategy);
 }
 
-static int mem_cgroup_max_reset(struct cgroup *cont, unsigned int event)
+static int mem_cgroup_reset(struct cgroup *cont, unsigned int event)
 {
        struct mem_cgroup *mem;
 
        mem = mem_cgroup_from_cont(cont);
-       res_counter_reset_max(&mem->res);
+       switch (event) {
+       case RES_MAX_USAGE:
+               res_counter_reset_max(&mem->res);
+               break;
+       case RES_FAILCNT:
+               res_counter_reset_failcnt(&mem->res);
+               break;
+       }
        return 0;
 }
 
@@ -916,7 +923,7 @@ static struct cftype mem_cgroup_files[] = {
        {
                .name = "max_usage_in_bytes",
                .private = RES_MAX_USAGE,
-               .trigger = mem_cgroup_max_reset,
+               .trigger = mem_cgroup_reset,
                .read_u64 = mem_cgroup_read,
        },
        {
@@ -928,6 +935,7 @@ static struct cftype mem_cgroup_files[] = {
        {
                .name = "failcnt",
                .private = RES_FAILCNT,
+               .trigger = mem_cgroup_reset,
                .read_u64 = mem_cgroup_read,
        },
        {