Commit 7c094fd6 authored by Vladimir Davydov's avatar Vladimir Davydov Committed by Linus Torvalds

memcg: fix mutex not unlocked on memcg_create_kmem_cache fail path

Commit 842e2873 ("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: default avatarVladimir Davydov <vdavydov@parallels.com>
Cc: Michal Hocko <mhocko@suse.cz>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Glauber Costa <glommer@parallels.com>
Acked-by: default avatarDavid Rientjes <rientjes@google.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 46bf16c4
...@@ -3400,7 +3400,7 @@ void mem_cgroup_destroy_cache(struct kmem_cache *cachep) ...@@ -3400,7 +3400,7 @@ void mem_cgroup_destroy_cache(struct kmem_cache *cachep)
static struct kmem_cache *memcg_create_kmem_cache(struct mem_cgroup *memcg, static struct kmem_cache *memcg_create_kmem_cache(struct mem_cgroup *memcg,
struct kmem_cache *s) struct kmem_cache *s)
{ {
struct kmem_cache *new; struct kmem_cache *new = NULL;
static char *tmp_name = NULL; static char *tmp_name = NULL;
static DEFINE_MUTEX(mutex); /* protects tmp_name */ static DEFINE_MUTEX(mutex); /* protects tmp_name */
...@@ -3416,7 +3416,7 @@ static struct kmem_cache *memcg_create_kmem_cache(struct mem_cgroup *memcg, ...@@ -3416,7 +3416,7 @@ static struct kmem_cache *memcg_create_kmem_cache(struct mem_cgroup *memcg,
if (!tmp_name) { if (!tmp_name) {
tmp_name = kmalloc(PATH_MAX, GFP_KERNEL); tmp_name = kmalloc(PATH_MAX, GFP_KERNEL);
if (!tmp_name) if (!tmp_name)
return NULL; goto out;
} }
rcu_read_lock(); rcu_read_lock();
...@@ -3426,12 +3426,11 @@ static struct kmem_cache *memcg_create_kmem_cache(struct mem_cgroup *memcg, ...@@ -3426,12 +3426,11 @@ static struct kmem_cache *memcg_create_kmem_cache(struct mem_cgroup *memcg,
new = kmem_cache_create_memcg(memcg, tmp_name, s->object_size, s->align, new = kmem_cache_create_memcg(memcg, tmp_name, s->object_size, s->align,
(s->flags & ~SLAB_PANIC), s->ctor, s); (s->flags & ~SLAB_PANIC), s->ctor, s);
if (new) if (new)
new->allocflags |= __GFP_KMEMCG; new->allocflags |= __GFP_KMEMCG;
else else
new = s; new = s;
out:
mutex_unlock(&mutex); mutex_unlock(&mutex);
return new; return new;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment