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>
This commit is contained in:
Родитель
85cc59db12
Коммит
29f2a4dac8
|
@ -143,4 +143,12 @@ static inline void res_counter_reset_max(struct res_counter *cnt)
|
||||||
spin_unlock_irqrestore(&cnt->lock, flags);
|
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
|
#endif
|
||||||
|
|
|
@ -857,12 +857,19 @@ static ssize_t mem_cgroup_write(struct cgroup *cont, struct cftype *cft,
|
||||||
mem_cgroup_write_strategy);
|
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;
|
struct mem_cgroup *mem;
|
||||||
|
|
||||||
mem = mem_cgroup_from_cont(cont);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -916,7 +923,7 @@ static struct cftype mem_cgroup_files[] = {
|
||||||
{
|
{
|
||||||
.name = "max_usage_in_bytes",
|
.name = "max_usage_in_bytes",
|
||||||
.private = RES_MAX_USAGE,
|
.private = RES_MAX_USAGE,
|
||||||
.trigger = mem_cgroup_max_reset,
|
.trigger = mem_cgroup_reset,
|
||||||
.read_u64 = mem_cgroup_read,
|
.read_u64 = mem_cgroup_read,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -928,6 +935,7 @@ static struct cftype mem_cgroup_files[] = {
|
||||||
{
|
{
|
||||||
.name = "failcnt",
|
.name = "failcnt",
|
||||||
.private = RES_FAILCNT,
|
.private = RES_FAILCNT,
|
||||||
|
.trigger = mem_cgroup_reset,
|
||||||
.read_u64 = mem_cgroup_read,
|
.read_u64 = mem_cgroup_read,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
Загрузка…
Ссылка в новой задаче