Index: linux-2.6/arch/x86/kernel/setup.c =================================================================== --- linux-2.6.orig/arch/x86/kernel/setup.c 2008-05-26 21:42:56.000000000 -0700 +++ linux-2.6/arch/x86/kernel/setup.c 2008-05-26 21:43:45.000000000 -0700 @@ -99,6 +99,14 @@ for_each_possible_cpu(i) { char *ptr; + + /* + * Only do this if the per cpu area is not already setuyp + * Zero based areas are setup immediately! + */ + if (__per_cpu_offset[i] == (unsigned long)__per_cpu_area0) + continue; + #ifndef CONFIG_NEED_MULTIPLE_NODES ptr = alloc_bootmem_pages(__per_cpu_size); #else Index: linux-2.6/include/asm-generic/sections.h =================================================================== --- linux-2.6.orig/include/asm-generic/sections.h 2008-05-26 21:42:56.000000000 -0700 +++ linux-2.6/include/asm-generic/sections.h 2008-05-26 21:43:45.000000000 -0700 @@ -15,6 +15,7 @@ #define __per_cpu_size ((unsigned long)&____per_cpu_size) #define __per_cpu_start ((char *)0) #define __per_cpu_end ((char *)__per_cpu_size) +extern char __per_cpu_area0; #else extern char __per_cpu_start[], __per_cpu_end[]; #define __per_cpu_load __per_cpu_start Index: linux-2.6/include/asm-generic/vmlinux.lds.h =================================================================== --- linux-2.6.orig/include/asm-generic/vmlinux.lds.h 2008-05-26 21:42:56.000000000 -0700 +++ linux-2.6/include/asm-generic/vmlinux.lds.h 2008-05-26 21:43:45.000000000 -0700 @@ -357,6 +357,9 @@ ____per_cpu_size = .; \ } \ . = __per_cpu_load + ____per_cpu_size; \ + . = ALIGN(align); \ + __per_cpu_area0 = .; \ + . = __per_cpu_area0 + ____per_cpu_size; \ data : { } :data #else #define PERCPU(align) \