ia64: on UP percpu variables are not small memory model
authorIngo Molnar <mingo@elte.hu>
Wed, 30 Jan 2008 22:27:58 +0000 (23:27 +0100)
committerIngo Molnar <mingo@elte.hu>
Wed, 30 Jan 2008 22:27:58 +0000 (23:27 +0100)
Tony says:

| The CONFIG_SMP=n path in ia64 makes quite radical changes ... rather
| than putting all the per-cpu stuff into the top 64K of address space
| and providing a per-cpu TLB mapping for that range to a different
| physical address ... it just makes all the per-cpu stuff link as ordinary
| variables in .data.

the new generic percpu code got confused about this as PER_CPU_ATTRIBUTES
was defined even on UP, so it picked up that small memory model - which
was not possible to get linked. The right fix is to only define that
on SMP. This resolved the build failures in my cross-compiling environment.

also link these variables into the .percpu section even on UP - some
assembly code has offset dependencies. (such as GET_IA64_MCA_DATA() in
arch/ia64/kernel/mca_asm.S)

Signed-off-by: Ingo Molnar <mingo@elte.hu>
Acked-by: Tony Luck <tony.luck@intel.com>
include/asm-ia64/percpu.h

index 26404b77f007b6029e4fba1fc276c36ec604cbc0..77f30b664b4eade81ca0985be35d97825fe0a3a8 100644 (file)
 
 #include <linux/threads.h>
 
 
 #include <linux/threads.h>
 
+#ifdef CONFIG_SMP
+
 #ifdef HAVE_MODEL_SMALL_ATTRIBUTE
 # define PER_CPU_ATTRIBUTES    __attribute__((__model__ (__small__)))
 #endif
 
 #ifdef HAVE_MODEL_SMALL_ATTRIBUTE
 # define PER_CPU_ATTRIBUTES    __attribute__((__model__ (__small__)))
 #endif
 
-#ifdef CONFIG_SMP
-
 #define __my_cpu_offset        __ia64_per_cpu_var(local_per_cpu_offset)
 
 extern void *per_cpu_init(void);
 
 #else /* ! SMP */
 
 #define __my_cpu_offset        __ia64_per_cpu_var(local_per_cpu_offset)
 
 extern void *per_cpu_init(void);
 
 #else /* ! SMP */
 
+#define PER_CPU_ATTRIBUTES     __attribute__((__section__(".data.percpu")))
+
 #define per_cpu_init()                         (__phys_per_cpu_start)
 
 #endif /* SMP */
 #define per_cpu_init()                         (__phys_per_cpu_start)
 
 #endif /* SMP */