lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <1477503688-69191-1-git-send-email-thgarnie@google.com>
Date:   Wed, 26 Oct 2016 10:41:28 -0700
From:   Thomas Garnier <thgarnie@...gle.com>
To:     Christoph Lameter <cl@...ux.com>,
        Pekka Enberg <penberg@...nel.org>,
        David Rientjes <rientjes@...gle.com>,
        Joonsoo Kim <iamjoonsoo.kim@....com>,
        Andrew Morton <akpm@...ux-foundation.org>
Cc:     linux-mm@...ck.org, linux-kernel@...r.kernel.org,
        gthelen@...gle.com, Thomas Garnier <thgarnie@...gle.com>
Subject: [PATCH v1] memcg: Prevent caches to be both OFF_SLAB & OBJFREELIST_SLAB

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.

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.

The proposed fix removes these flags by default at the entrance of
__kmem_cache_create. This way the function will define which way the
freelist should be handled at this stage for the new cache.

Fixes: b03a017bebc4 ("mm/slab: introduce new slab management type, OBJFREELIST_SLAB")
Signed-off-by: Thomas Garnier <thgarnie@...gle.com>
Signed-off-by: Greg Thelen <gthelen@...gle.com>
---
Based on next-20161025
---
 mm/slab.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/mm/slab.c b/mm/slab.c
index 3c83c29..efe280a 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -2027,6 +2027,14 @@ __kmem_cache_create (struct kmem_cache *cachep, unsigned long flags)
 	int err;
 	size_t size = cachep->size;
 
+	/*
+	 * memcg re-creates caches with the flags of the originals. Remove
+	 * the freelist related flags to ensure they are re-defined at this
+	 * stage. Prevent having both flags on edge cases like with pagealloc
+	 * if the original cache was created too early to be OFF_SLAB.
+	 */
+	flags &= ~(CFLGS_OBJFREELIST_SLAB|CFLGS_OFF_SLAB);
+
 #if DEBUG
 #if FORCED_DEBUG
 	/*
-- 
2.8.0.rc3.226.g39d4020

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ