Commit 29f2a4dac856e9433a502b05b40e8e90385d8e27
Committed by
Linus Torvalds
1 parent
85cc59db12
Exists in
master
and in
4 other branches
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 |
mm/memcontrol.c
... | ... | @@ -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 | { |