Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8a965b3b authored by Christoph Lameter's avatar Christoph Lameter Committed by Pekka Enberg
Browse files

mm, slab_common: Fix bootstrap creation of kmalloc caches



For SLAB the kmalloc caches must be created in ascending sizes in order
for the OFF_SLAB sub-slab cache to work properly.

Create the non power of two caches immediately after the prior power of
two kmalloc cache. Do not create the non power of two caches before all
other caches.

Reported-and-tested-by: default avatarTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Signed-off-by: default avatarChristoph Lamete <cl@linux.com>
Link: http://lkml.kernel.org/r/201305040348.CIF81716.OStQOHFJMFLOVF@I-love.SAKURA.ne.jp


Signed-off-by: default avatarPekka Enberg <penberg@kernel.org>
parent 6286ae97
Loading
Loading
Loading
Loading
+15 −9
Original line number Diff line number Diff line
@@ -442,17 +442,23 @@ void __init create_kmalloc_caches(unsigned long flags)
		for (i = 128 + 8; i <= 192; i += 8)
			size_index[size_index_elem(i)] = 8;
	}
	/* Caches that are not of the two-to-the-power-of size */
	if (KMALLOC_MIN_SIZE <= 32 && !kmalloc_caches[1])
	for (i = KMALLOC_SHIFT_LOW; i <= KMALLOC_SHIFT_HIGH; i++) {
		if (!kmalloc_caches[i]) {
			kmalloc_caches[i] = create_kmalloc_cache(NULL,
							1 << i, flags);

			/*
			 * Caches that are not of the two-to-the-power-of size.
			 * These have to be created immediately after the
			 * earlier power of two caches
			 */
			if (KMALLOC_MIN_SIZE <= 32 && !kmalloc_caches[1] && i == 6)
				kmalloc_caches[1] = create_kmalloc_cache(NULL, 96, flags);

	if (KMALLOC_MIN_SIZE <= 64 && !kmalloc_caches[2])
			if (KMALLOC_MIN_SIZE <= 64 && !kmalloc_caches[2] && i == 7)
				kmalloc_caches[2] = create_kmalloc_cache(NULL, 192, flags);

	for (i = KMALLOC_SHIFT_LOW; i <= KMALLOC_SHIFT_HIGH; i++)
		if (!kmalloc_caches[i])
			kmalloc_caches[i] = create_kmalloc_cache(NULL,
							1 << i, flags);
		}
	}

	/* Kmalloc array is now usable */
	slab_state = UP;