aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Hocko <mhocko@suse.cz>2012-01-12 20:18:50 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2012-01-12 23:13:07 -0500
commitc3cecc683446ad54ca587d7123bd3ce94bd7b8e1 (patch)
tree27dfb859c1c45a6369d62eac4b5b9ad62871b7ce
parent9fb4b7cc0724f178d4b24a2a566ea1e7cb120b82 (diff)
memcg: free entries in soft_limit_tree if allocation fails
If we are not able to allocate tree nodes for all NUMA nodes then we should release those that were allocated. Signed-off-by: Michal Hocko <mhocko@suse.cz> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Cc: Michal Hocko <mhocko@suse.cz> Cc: Hugh Dickins <hughd@google.com> Cc: Balbir Singh <bsingharora@gmail.com> Cc: David Rientjes <rientjes@google.com> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--mm/memcontrol.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 4c53e971749e..2a1f7847b6ad 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -4960,7 +4960,7 @@ static int mem_cgroup_soft_limit_tree_init(void)
4960 tmp = -1; 4960 tmp = -1;
4961 rtpn = kzalloc_node(sizeof(*rtpn), GFP_KERNEL, tmp); 4961 rtpn = kzalloc_node(sizeof(*rtpn), GFP_KERNEL, tmp);
4962 if (!rtpn) 4962 if (!rtpn)
4963 return 1; 4963 goto err_cleanup;
4964 4964
4965 soft_limit_tree.rb_tree_per_node[node] = rtpn; 4965 soft_limit_tree.rb_tree_per_node[node] = rtpn;
4966 4966
@@ -4971,6 +4971,16 @@ static int mem_cgroup_soft_limit_tree_init(void)
4971 } 4971 }
4972 } 4972 }
4973 return 0; 4973 return 0;
4974
4975err_cleanup:
4976 for_each_node_state(node, N_POSSIBLE) {
4977 if (!soft_limit_tree.rb_tree_per_node[node])
4978 break;
4979 kfree(soft_limit_tree.rb_tree_per_node[node]);
4980 soft_limit_tree.rb_tree_per_node[node] = NULL;
4981 }
4982 return 1;
4983
4974} 4984}
4975 4985
4976static struct cgroup_subsys_state * __ref 4986static struct cgroup_subsys_state * __ref