aboutsummaryrefslogtreecommitdiffstats
path: root/mm/slab_common.c
diff options
context:
space:
mode:
authorVladimir Davydov <vdavydov@parallels.com>2014-01-23 18:52:56 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2014-01-23 19:36:51 -0500
commit363a044f739b0f07a8c063b838c5528d10720e02 (patch)
tree94ed7eda83ddb72ffe775bfe7540890c409f3ec3 /mm/slab_common.c
parent3965fc3652244651006ebb31c8c45318ce84818f (diff)
memcg, slab: kmem_cache_create_memcg(): fix memleak on fail path
We do not free the cache's memcg_params if __kmem_cache_create fails. Fix this. Plus, rename memcg_register_cache() to memcg_alloc_cache_params(), because it actually does not register the cache anywhere, but simply initialize kmem_cache::memcg_params. [akpm@linux-foundation.org: fix build] Signed-off-by: Vladimir Davydov <vdavydov@parallels.com> Cc: Michal Hocko <mhocko@suse.cz> Cc: Glauber Costa <glommer@gmail.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Balbir Singh <bsingharora@gmail.com> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Pekka Enberg <penberg@kernel.org> Cc: Christoph Lameter <cl@linux.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/slab_common.c')
-rw-r--r--mm/slab_common.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/mm/slab_common.c b/mm/slab_common.c
index f70df3ef6f1a..70f9e249ac30 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -205,7 +205,7 @@ kmem_cache_create_memcg(struct mem_cgroup *memcg, const char *name, size_t size,
205 if (!s->name) 205 if (!s->name)
206 goto out_free_cache; 206 goto out_free_cache;
207 207
208 err = memcg_register_cache(memcg, s, parent_cache); 208 err = memcg_alloc_cache_params(memcg, s, parent_cache);
209 if (err) 209 if (err)
210 goto out_free_cache; 210 goto out_free_cache;
211 211
@@ -235,6 +235,7 @@ out_unlock:
235 return s; 235 return s;
236 236
237out_free_cache: 237out_free_cache:
238 memcg_free_cache_params(s);
238 kfree(s->name); 239 kfree(s->name);
239 kmem_cache_free(kmem_cache, s); 240 kmem_cache_free(kmem_cache, s);
240 goto out_unlock; 241 goto out_unlock;