aboutsummaryrefslogtreecommitdiffstats
path: root/mm/memcontrol.c
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 /mm/memcontrol.c
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 'mm/memcontrol.c')
-rw-r--r--mm/memcontrol.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 8e4be9cb2a6a..8ffec674c5ac 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -2272,11 +2272,12 @@ free_out:
2272 return ERR_PTR(-ENOMEM); 2272 return ERR_PTR(-ENOMEM);
2273} 2273}
2274 2274
2275static void mem_cgroup_pre_destroy(struct cgroup_subsys *ss, 2275static int mem_cgroup_pre_destroy(struct cgroup_subsys *ss,
2276 struct cgroup *cont) 2276 struct cgroup *cont)
2277{ 2277{
2278 struct mem_cgroup *mem = mem_cgroup_from_cont(cont); 2278 struct mem_cgroup *mem = mem_cgroup_from_cont(cont);
2279 mem_cgroup_force_empty(mem, false); 2279
2280 return mem_cgroup_force_empty(mem, false);
2280} 2281}
2281 2282
2282static void mem_cgroup_destroy(struct cgroup_subsys *ss, 2283static void mem_cgroup_destroy(struct cgroup_subsys *ss,