Commit 956e46ef authored by Chris Mason's avatar Chris Mason Committed by Linus Torvalds

mm/slab: Fix crash during slab init

Commit 8a965b3b ("mm, slab_common: Fix bootstrap creation of kmalloc
caches") introduced a regression that caused us to crash early during
boot.  The commit was introducing ordering of slab creation, making sure
two odd-sized slabs were created after specific powers of two sizes.

But, if any of the power of two slabs were created earlier during boot,
slabs at index 1 or 2 might not get created at all.  This patch makes
sure none of the slabs get skipped.

Tony Lindgren bisected this down to the offending commit, which really
helped because bisect kept bringing me to almost but not quite this one.
Signed-off-by: default avatarChris Mason <chris.mason@fusionio.com>
Acked-by: default avatarChristoph Lameter <cl@linux.com>
Acked-by: default avatarTony Lindgren <tony@atomide.com>
Acked-by: default avatarSoren Brinkmann <soren.brinkmann@xilinx.com>
Tested-by: default avatarTetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Tested-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent ebb37277
...@@ -446,18 +446,18 @@ void __init create_kmalloc_caches(unsigned long flags) ...@@ -446,18 +446,18 @@ void __init create_kmalloc_caches(unsigned long flags)
if (!kmalloc_caches[i]) { if (!kmalloc_caches[i]) {
kmalloc_caches[i] = create_kmalloc_cache(NULL, kmalloc_caches[i] = create_kmalloc_cache(NULL,
1 << i, flags); 1 << i, flags);
}
/* /*
* Caches that are not of the two-to-the-power-of size. * Caches that are not of the two-to-the-power-of size.
* These have to be created immediately after the * These have to be created immediately after the
* earlier power of two caches * earlier power of two caches
*/ */
if (KMALLOC_MIN_SIZE <= 32 && !kmalloc_caches[1] && i == 6) if (KMALLOC_MIN_SIZE <= 32 && !kmalloc_caches[1] && i == 6)
kmalloc_caches[1] = create_kmalloc_cache(NULL, 96, flags); kmalloc_caches[1] = create_kmalloc_cache(NULL, 96, flags);
if (KMALLOC_MIN_SIZE <= 64 && !kmalloc_caches[2] && i == 7) if (KMALLOC_MIN_SIZE <= 64 && !kmalloc_caches[2] && i == 7)
kmalloc_caches[2] = create_kmalloc_cache(NULL, 192, flags); kmalloc_caches[2] = create_kmalloc_cache(NULL, 192, flags);
}
} }
/* Kmalloc array is now usable */ /* Kmalloc array is now usable */
......
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