2002-11-05 05:53:37

by Anton Blanchard

[permalink] [raw]
Subject: [PATCH] fix slab allocator for non zero boot cpu


Hi,

The slab allocator doesnt initialise ->array for all cpus. This means
we fail to boot on a machine with boot cpu != 0. I was testing current
2.5 BK.

Luckily Rusty was at hand to explain the ins and outs of initialisers
to me. Manfred, does this look OK to you?

Anton

===== mm/slab.c 1.46 vs edited =====
--- 1.46/mm/slab.c Sat Nov 2 08:34:38 2002
+++ edited/mm/slab.c Tue Nov 5 15:55:55 2002
@@ -437,7 +437,8 @@
/* internal cache of cache description objs */
static kmem_cache_t cache_cache = {
.lists = LIST3_INIT(cache_cache.lists),
- .array = { [0] = &initarray_cache.cache },
+ /* Allow for boot cpu != 0 */
+ .array = { [0 ... NR_CPUS-1] = &initarray_cache.cache },
.batchcount = 1,
.limit = BOOT_CPUCACHE_ENTRIES,
.objsize = sizeof(kmem_cache_t),


2002-11-05 20:20:23

by Manfred Spraul

[permalink] [raw]
Subject: Re: [PATCH] fix slab allocator for non zero boot cpu

Anton Blanchard wrote:

>Hi,
>
>The slab allocator doesnt initialise ->array for all cpus. This means
>we fail to boot on a machine with boot cpu != 0. I was testing current
>2.5 BK.
>
>Luckily Rusty was at hand to explain the ins and outs of initialisers
>to me. Manfred, does this look OK to you?
>
I don't like the patch - it removes the safety net.

initarray_cache is __initdata, and is replaced with actual data after
the kmalloc caches work, but only for the cpu that performed the
bootstrap (end of kmem_cache_sizes_init())

With your patch, the pointer to the head arrays of the other cpus still
point to an __initdata variable. It's even oopsable, if a
CPU_ONLINE_PREPARE is failed by another subsystem.

What about the attached patch?

--
Manfred


Attachments:
patch-other (648.00 B)