--- arch/x86/kernel/setup64.c | 2 +- include/asm-x86/pda.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) Index: linux-2.6/arch/x86/kernel/setup64.c =================================================================== --- linux-2.6.orig/arch/x86/kernel/setup64.c 2007-11-16 19:57:12.894179747 -0800 +++ linux-2.6/arch/x86/kernel/setup64.c 2007-11-16 20:12:18.314706150 -0800 @@ -129,7 +129,7 @@ void pda_init(int cpu) asm volatile("movl %0,%%fs ; movl %0,%%gs" :: "r" (0)); /* Memory clobbers used to order PDA accessed */ mb(); - wrmsrl(MSR_GS_BASE, pda); + wrmsrl(MSR_GS_BASE, __per_cpu_start + per_cpu_offset(cpu)); mb(); pda->cpunumber = cpu; Index: linux-2.6/include/asm-x86/pda.h =================================================================== --- linux-2.6.orig/include/asm-x86/pda.h 2007-11-16 19:43:34.160333462 -0800 +++ linux-2.6/include/asm-x86/pda.h 2007-11-16 20:16:24.609706202 -0800 @@ -36,7 +36,7 @@ struct x8664_pda { unsigned irq_thermal_count; unsigned irq_threshold_count; unsigned irq_spurious_count; -} ____cacheline_aligned_in_smp; +}; extern struct x8664_pda *_cpu_pda[]; @@ -52,9 +52,9 @@ extern void __bad_pda_field(void) __attr * proxy_pda doesn't actually exist, but tell gcc it is accessed for * all PDA accesses so it gets read/write dependencies right. */ -extern struct x8664_pda _proxy_pda; +DECLARE_PER_CPU(struct x8664_pda, pda); -#define pda_offset(field) offsetof(struct x8664_pda, field) +#define pda_offset(field) (&pda.field) #define pda_to_op(op,field,val) do { \ typedef typeof(_proxy_pda.field) T__; \