aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorKAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>2009-04-02 19:57:26 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-04-02 22:04:54 -0400
commitec64f51545fffbc4cb968f0cea56341a4b07e85a (patch)
tree575d890a6759d81f3324fa2a22ca6ab14a41eefc /include
parent38460b48d06440de46b34cb778bd6c4855030754 (diff)
cgroup: fix frequent -EBUSY at rmdir
In following situation, with memory subsystem, /groupA use_hierarchy==1 /01 some tasks /02 some tasks /03 some tasks /04 empty When tasks under 01/02/03 hit limit on /groupA, hierarchical reclaim is triggered and the kernel walks tree under groupA. In this case, rmdir /groupA/04 fails with -EBUSY frequently because of temporal refcnt from the kernel. In general. cgroup can be rmdir'd if there are no children groups and no tasks. Frequent fails of rmdir() is not useful to users. (And the reason for -EBUSY is unknown to users.....in most cases) This patch tries to modify above behavior, by - retries if css_refcnt is got by someone. - add "return value" to pre_destroy() and allows subsystem to say "we're really busy!" Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Paul Menage <menage@google.com> Cc: Li Zefan <lizf@cn.fujitsu.com> Cc: Balbir Singh <balbir@in.ibm.com> Cc: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include')
-rw-r--r--include/linux/cgroup.h6
1 files changed, 5 insertions, 1 deletions
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index 9a23bb098205..7d824b80b3d7 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h
@@ -135,6 +135,10 @@ enum {
135 CGRP_RELEASABLE, 135 CGRP_RELEASABLE,
136 /* Control Group requires release notifications to userspace */ 136 /* Control Group requires release notifications to userspace */
137 CGRP_NOTIFY_ON_RELEASE, 137 CGRP_NOTIFY_ON_RELEASE,
138 /*
139 * A thread in rmdir() is wating for this cgroup.
140 */
141 CGRP_WAIT_ON_RMDIR,
138}; 142};
139 143
140struct cgroup { 144struct cgroup {
@@ -360,7 +364,7 @@ int cgroup_is_descendant(const struct cgroup *cgrp, struct task_struct *task);
360struct cgroup_subsys { 364struct cgroup_subsys {
361 struct cgroup_subsys_state *(*create)(struct cgroup_subsys *ss, 365 struct cgroup_subsys_state *(*create)(struct cgroup_subsys *ss,
362 struct cgroup *cgrp); 366 struct cgroup *cgrp);
363 void (*pre_destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp); 367 int (*pre_destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp);
364 void (*destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp); 368 void (*destroy)(struct cgroup_subsys *ss, struct cgroup *cgrp);
365 int (*can_attach)(struct cgroup_subsys *ss, 369 int (*can_attach)(struct cgroup_subsys *ss,
366 struct cgroup *cgrp, struct task_struct *tsk); 370 struct cgroup *cgrp, struct task_struct *tsk);