Index: linux-2.6/arch/x86/kernel/setup.c =================================================================== --- linux-2.6.orig/arch/x86/kernel/setup.c 2008-05-28 00:00:36.000000000 -0700 +++ linux-2.6/arch/x86/kernel/setup.c 2008-05-28 00:00:46.000000000 -0700 @@ -88,21 +88,19 @@ void __init setup_per_cpu_areas(void) { int i, highest_cpu = 0; - unsigned long size; #ifdef CONFIG_HOTPLUG_CPU prefill_possible_map(); #endif /* Copy section for each CPU (we discard the original) */ - size = __per_cpu_size; printk(KERN_INFO "PERCPU: Allocating %lu bytes of per cpu data\n", - size); + __per_cpu_size); for_each_possible_cpu(i) { char *ptr; #ifndef CONFIG_NEED_MULTIPLE_NODES - ptr = alloc_bootmem_pages(size); + ptr = alloc_bootmem_pages(__per_cpu_size); #else int node = early_cpu_to_node(i); if (!node_online(node) || !NODE_DATA(node)) { @@ -111,7 +109,8 @@ "cpu %d has no node or node-local memory\n", i); } else - ptr = alloc_bootmem_pages_node(NODE_DATA(node), size); + ptr = alloc_bootmem_pages_node(NODE_DATA(node), + __per_cpu_size); #endif if (!ptr) panic("Cannot allocate cpu data for CPU %d\n", i); Index: linux-2.6/init/main.c =================================================================== --- linux-2.6.orig/init/main.c 2008-05-28 00:00:36.000000000 -0700 +++ linux-2.6/init/main.c 2008-05-28 00:00:46.000000000 -0700 @@ -393,17 +393,16 @@ static void __init setup_per_cpu_areas(void) { - unsigned long size, i; + unsigned long i; char *ptr; unsigned long nr_possible_cpus = num_possible_cpus(); /* Copy section for each CPU (we discard the original) */ - size = ALIGN(__per_cpu_end - __per_cpu_start, PAGE_SIZE); ptr = alloc_bootmem_pages(size * nr_possible_cpus); for_each_possible_cpu(i) { __per_cpu_offset[i] = ptr - __per_cpu_start; - memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start); + memcpy(ptr, __per_cpu_start, __per_cpu_size); ptr += size; } }