aboutsummaryrefslogtreecommitdiffstats
path: root/mm/memcontrol.c
diff options
context:
space:
mode:
authorVladimir Davydov <vdavydov@parallels.com>2014-01-30 18:46:14 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2014-01-30 19:56:56 -0500
commit7c094fd698de2f333fa39b6da213f880d40b9bfe (patch)
tree434b53bc87fd5bcc3293b0bc6f4328fb31ac1f2b /mm/memcontrol.c
parent46bf16c44b90791445975463da671521fc430cae (diff)
memcg: fix mutex not unlocked on memcg_create_kmem_cache fail path
Commit 842e2873697e ("memcg: get rid of kmem_cache_dup()") introduced a mutex for memcg_create_kmem_cache() to protect the tmp_name buffer that holds the memcg name. It failed to unlock the mutex if this buffer could not be allocated. This patch fixes the issue by appropriately unlocking the mutex if the allocation fails. Signed-off-by: Vladimir Davydov <vdavydov@parallels.com> Cc: Michal Hocko <mhocko@suse.cz> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Glauber Costa <glommer@parallels.com> Acked-by: David Rientjes <rientjes@google.com> 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.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 19d5d4274e22..53385cd4e6f0 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -3400,7 +3400,7 @@ void mem_cgroup_destroy_cache(struct kmem_cache *cachep)
3400static struct kmem_cache *memcg_create_kmem_cache(struct mem_cgroup *memcg, 3400static struct kmem_cache *memcg_create_kmem_cache(struct mem_cgroup *memcg,
3401 struct kmem_cache *s) 3401 struct kmem_cache *s)
3402{ 3402{
3403 struct kmem_cache *new; 3403 struct kmem_cache *new = NULL;
3404 static char *tmp_name = NULL; 3404 static char *tmp_name = NULL;
3405 static DEFINE_MUTEX(mutex); /* protects tmp_name */ 3405 static DEFINE_MUTEX(mutex); /* protects tmp_name */
3406 3406
@@ -3416,7 +3416,7 @@ static struct kmem_cache *memcg_create_kmem_cache(struct mem_cgroup *memcg,
3416 if (!tmp_name) { 3416 if (!tmp_name) {
3417 tmp_name = kmalloc(PATH_MAX, GFP_KERNEL); 3417 tmp_name = kmalloc(PATH_MAX, GFP_KERNEL);
3418 if (!tmp_name) 3418 if (!tmp_name)
3419 return NULL; 3419 goto out;
3420 } 3420 }
3421 3421
3422 rcu_read_lock(); 3422 rcu_read_lock();
@@ -3426,12 +3426,11 @@ static struct kmem_cache *memcg_create_kmem_cache(struct mem_cgroup *memcg,
3426 3426
3427 new = kmem_cache_create_memcg(memcg, tmp_name, s->object_size, s->align, 3427 new = kmem_cache_create_memcg(memcg, tmp_name, s->object_size, s->align,
3428 (s->flags & ~SLAB_PANIC), s->ctor, s); 3428 (s->flags & ~SLAB_PANIC), s->ctor, s);
3429
3430 if (new) 3429 if (new)
3431 new->allocflags |= __GFP_KMEMCG; 3430 new->allocflags |= __GFP_KMEMCG;
3432 else 3431 else
3433 new = s; 3432 new = s;
3434 3433out:
3435 mutex_unlock(&mutex); 3434 mutex_unlock(&mutex);
3436 return new; 3435 return new;
3437} 3436}