diff options
author | Michal Hocko <mhocko@suse.cz> | 2012-10-26 07:37:32 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2012-11-05 12:16:59 -0500 |
commit | ab5196c202c60f84c7a74975742806aad242d9e3 (patch) | |
tree | d8a495d56a4e94033bdb2fc3b812da8effea1812 /mm/memcontrol.c | |
parent | b25ed609d0eecf077db607e88ea70bae83b6adb2 (diff) |
memcg: make mem_cgroup_reparent_charges non failing
Now that pre_destroy callbacks are called from the context where neither
any task can attach the group nor any children group can be added there
is no other way to fail from mem_cgroup_pre_destroy.
mem_cgroup_pre_destroy doesn't have to take a reference to memcg's css
because all css' are marked dead already.
tj: Remove now unused local variable @cgrp from
mem_cgroup_reparent_charges().
Signed-off-by: Michal Hocko <mhocko@suse.cz>
Reviewed-by: Glauber Costa <glommer@parallels.com>
Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'mm/memcontrol.c')
-rw-r--r-- | mm/memcontrol.c | 19 |
1 files changed, 6 insertions, 13 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 930edfaa5187..6678f991c6c6 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -3740,14 +3740,11 @@ static void mem_cgroup_force_empty_list(struct mem_cgroup *memcg, | |||
3740 | * | 3740 | * |
3741 | * Caller is responsible for holding css reference on the memcg. | 3741 | * Caller is responsible for holding css reference on the memcg. |
3742 | */ | 3742 | */ |
3743 | static int mem_cgroup_reparent_charges(struct mem_cgroup *memcg) | 3743 | static void mem_cgroup_reparent_charges(struct mem_cgroup *memcg) |
3744 | { | 3744 | { |
3745 | struct cgroup *cgrp = memcg->css.cgroup; | ||
3746 | int node, zid; | 3745 | int node, zid; |
3747 | 3746 | ||
3748 | do { | 3747 | do { |
3749 | if (cgroup_task_count(cgrp) || !list_empty(&cgrp->children)) | ||
3750 | return -EBUSY; | ||
3751 | /* This is for making all *used* pages to be on LRU. */ | 3748 | /* This is for making all *used* pages to be on LRU. */ |
3752 | lru_add_drain_all(); | 3749 | lru_add_drain_all(); |
3753 | drain_all_stock_sync(memcg); | 3750 | drain_all_stock_sync(memcg); |
@@ -3773,8 +3770,6 @@ static int mem_cgroup_reparent_charges(struct mem_cgroup *memcg) | |||
3773 | * charge before adding to the LRU. | 3770 | * charge before adding to the LRU. |
3774 | */ | 3771 | */ |
3775 | } while (res_counter_read_u64(&memcg->res, RES_USAGE) > 0); | 3772 | } while (res_counter_read_u64(&memcg->res, RES_USAGE) > 0); |
3776 | |||
3777 | return 0; | ||
3778 | } | 3773 | } |
3779 | 3774 | ||
3780 | /* | 3775 | /* |
@@ -3811,7 +3806,9 @@ static int mem_cgroup_force_empty(struct mem_cgroup *memcg) | |||
3811 | 3806 | ||
3812 | } | 3807 | } |
3813 | lru_add_drain(); | 3808 | lru_add_drain(); |
3814 | return mem_cgroup_reparent_charges(memcg); | 3809 | mem_cgroup_reparent_charges(memcg); |
3810 | |||
3811 | return 0; | ||
3815 | } | 3812 | } |
3816 | 3813 | ||
3817 | static int mem_cgroup_force_empty_write(struct cgroup *cont, unsigned int event) | 3814 | static int mem_cgroup_force_empty_write(struct cgroup *cont, unsigned int event) |
@@ -5008,13 +5005,9 @@ free_out: | |||
5008 | static int mem_cgroup_pre_destroy(struct cgroup *cont) | 5005 | static int mem_cgroup_pre_destroy(struct cgroup *cont) |
5009 | { | 5006 | { |
5010 | struct mem_cgroup *memcg = mem_cgroup_from_cont(cont); | 5007 | struct mem_cgroup *memcg = mem_cgroup_from_cont(cont); |
5011 | int ret; | ||
5012 | 5008 | ||
5013 | css_get(&memcg->css); | 5009 | mem_cgroup_reparent_charges(memcg); |
5014 | ret = mem_cgroup_reparent_charges(memcg); | 5010 | return 0; |
5015 | css_put(&memcg->css); | ||
5016 | |||
5017 | return ret; | ||
5018 | } | 5011 | } |
5019 | 5012 | ||
5020 | static void mem_cgroup_destroy(struct cgroup *cont) | 5013 | static void mem_cgroup_destroy(struct cgroup *cont) |