Fix issues in cpuup. Signed-off-by: Christoph Lameter --- mm/slub.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) Index: linux-2.6.22-rc6-mm1/mm/slub.c =================================================================== --- linux-2.6.22-rc6-mm1.orig/mm/slub.c 2007-07-03 17:29:16.000000000 -0700 +++ linux-2.6.22-rc6-mm1/mm/slub.c 2007-07-03 17:29:23.000000000 -0700 @@ -2016,21 +2016,28 @@ static int alloc_kmem_cache_cpus(struct return 1; } +/* + * Initialize the per cpu array. + */ +static void init_alloc_cpu_cpu(int cpu) +{ + int i; + + for (i = NR_KMEM_CACHE_CPU - 1; i >= 0; i--) + free_kmem_cache_cpu(&per_cpu(kmem_cache_cpu, cpu)[i], cpu); +} + static void __init init_alloc_cpu(void) { int cpu; - int i; - for_each_online_cpu(cpu) { - for (i = NR_KMEM_CACHE_CPU - 1; i >= 0; i--) - free_kmem_cache_cpu(&per_cpu(kmem_cache_cpu, cpu)[i], - cpu); - } + for_each_online_cpu(cpu) + init_alloc_cpu_cpu(cpu); } #else static inline void free_kmem_cache_cpus(struct kmem_cache *s) {} -static inline void init_alloc_cpu(struct kmem_cache *s) {} +static inline void init_alloc_cpu(void) {} static inline int alloc_kmem_cache_cpus(struct kmem_cache *s, gfp_t flags) { @@ -3088,10 +3095,12 @@ void __init kmem_cache_init(void) #ifdef CONFIG_SMP register_cpu_notifier(&slab_notifier); -#endif - kmem_size = offsetof(struct kmem_cache, cpu_slab) + nr_cpu_ids * sizeof(struct kmem_cache_cpu *); +#else + kmem_size = sizeof(struct kmem_cache); +#endif + printk(KERN_INFO "SLUB: Genslabs=%d, HWalign=%d, Order=%d-%d, MinObjects=%d," " CPUs=%d, Nodes=%d\n", @@ -3238,6 +3247,7 @@ static int __cpuinit slab_cpuup_callback switch (action) { case CPU_UP_PREPARE: case CPU_UP_PREPARE_FROZEN: + init_alloc_cpu_cpu(cpu); down_read(&slub_lock); list_for_each_entry(s, &slab_caches, list) s->cpu_slab[cpu] = alloc_kmem_cache_cpu(cpu,