Commit 53c1792b authored by Greg Thelen's avatar Greg Thelen Committed by Greg Kroah-Hartman

memcg: prevent memcg caches to be both OFF_SLAB & OBJFREELIST_SLAB

commit f773e36d upstream.

While testing OBJFREELIST_SLAB integration with pagealloc, we found a
bug where kmem_cache(sys) would be created with both CFLGS_OFF_SLAB &
CFLGS_OBJFREELIST_SLAB.  When it happened, critical allocations needed
for loading drivers or creating new caches will fail.

The original kmem_cache is created early making OFF_SLAB not possible.
When kmem_cache(sys) is created, OFF_SLAB is possible and if pagealloc
is enabled it will try to enable it first under certain conditions.
Given kmem_cache(sys) reuses the original flag, you can have both flags
at the same time resulting in allocation failures and odd behaviors.

This fix discards allocator specific flags from memcg before calling
create_cache.

The bug exists since 4.6-rc1 and affects testing debug pagealloc
configurations.

Fixes: b03a017b ("mm/slab: introduce new slab management type, OBJFREELIST_SLAB")
Link: http://lkml.kernel.org/r/1478553075-120242-1-git-send-email-thgarnie@google.comSigned-off-by: default avatarGreg Thelen <gthelen@google.com>
Signed-off-by: default avatarThomas Garnier <thgarnie@google.com>
Tested-by: default avatarThomas Garnier <thgarnie@google.com>
Acked-by: default avatarChristoph Lameter <cl@linux.com>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: David Rientjes <rientjes@google.com>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Vladimir Davydov <vdavydov.dev@gmail.com>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 02e1ee6b
...@@ -533,8 +533,8 @@ void memcg_create_kmem_cache(struct mem_cgroup *memcg, ...@@ -533,8 +533,8 @@ void memcg_create_kmem_cache(struct mem_cgroup *memcg,
s = create_cache(cache_name, root_cache->object_size, s = create_cache(cache_name, root_cache->object_size,
root_cache->size, root_cache->align, root_cache->size, root_cache->align,
root_cache->flags, root_cache->ctor, root_cache->flags & CACHE_CREATE_MASK,
memcg, root_cache); root_cache->ctor, memcg, root_cache);
/* /*
* If we could not create a memcg cache, do not complain, because * If we could not create a memcg cache, do not complain, because
* that's not critical at all as we can always proceed with the root * that's not critical at all as we can always proceed with the root
......
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