Commit 29f2a4dac856e9433a502b05b40e8e90385d8e27

Authored by Pavel Emelyanov
Committed by Linus Torvalds
1 parent 85cc59db12

memcgroup: implement failcounter reset

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>

Showing 2 changed files with 19 additions and 3 deletions Side-by-side Diff

include/linux/res_counter.h
... ... @@ -143,5 +143,13 @@
143 143 spin_unlock_irqrestore(&cnt->lock, flags);
144 144 }
145 145  
  146 +static inline void res_counter_reset_failcnt(struct res_counter *cnt)
  147 +{
  148 + unsigned long flags;
  149 +
  150 + spin_lock_irqsave(&cnt->lock, flags);
  151 + cnt->failcnt = 0;
  152 + spin_unlock_irqrestore(&cnt->lock, flags);
  153 +}
146 154 #endif
... ... @@ -857,12 +857,19 @@
857 857 mem_cgroup_write_strategy);
858 858 }
859 859  
860   -static int mem_cgroup_max_reset(struct cgroup *cont, unsigned int event)
  860 +static int mem_cgroup_reset(struct cgroup *cont, unsigned int event)
861 861 {
862 862 struct mem_cgroup *mem;
863 863  
864 864 mem = mem_cgroup_from_cont(cont);
865   - res_counter_reset_max(&mem->res);
  865 + switch (event) {
  866 + case RES_MAX_USAGE:
  867 + res_counter_reset_max(&mem->res);
  868 + break;
  869 + case RES_FAILCNT:
  870 + res_counter_reset_failcnt(&mem->res);
  871 + break;
  872 + }
866 873 return 0;
867 874 }
868 875  
... ... @@ -916,7 +923,7 @@
916 923 {
917 924 .name = "max_usage_in_bytes",
918 925 .private = RES_MAX_USAGE,
919   - .trigger = mem_cgroup_max_reset,
  926 + .trigger = mem_cgroup_reset,
920 927 .read_u64 = mem_cgroup_read,
921 928 },
922 929 {
... ... @@ -928,6 +935,7 @@
928 935 {
929 936 .name = "failcnt",
930 937 .private = RES_FAILCNT,
  938 + .trigger = mem_cgroup_reset,
931 939 .read_u64 = mem_cgroup_read,
932 940 },
933 941 {