From: Ivan Kokshaysky When CONFIG_SMP is not set, spinlock_t is an empty structure, so its address has arbitrary alignment. The prefetch instructions with unaligned address don't have visible side effects on alphas with SRM console (except performance degradation) - the PALcode handles unaligned traps caused by prefetch instructions internally. However, on old AlphaBIOS/MILO boxes unaligned prefetch leads to unhandled alignment trap and kernel panic. --- include/asm-alpha/processor.h | 11 +++++++++++ 1 files changed, 11 insertions(+) diff -puN include/asm-alpha/processor.h~alpha-prefetch_spinlock-fix include/asm-alpha/processor.h --- 25/include/asm-alpha/processor.h~alpha-prefetch_spinlock-fix 2004-01-11 12:00:07.000000000 -0800 +++ 25-akpm/include/asm-alpha/processor.h 2004-01-11 12:00:07.000000000 -0800 @@ -78,6 +78,11 @@ unsigned long get_wchan(struct task_stru #define ARCH_HAS_PREFETCHW #define ARCH_HAS_SPINLOCK_PREFETCH +#ifndef CONFIG_SMP +/* Nothing to prefetch. */ +#define spin_lock_prefetch(lock) do { } while (0) +#endif + #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) extern inline void prefetch(const void *ptr) { @@ -89,10 +94,13 @@ extern inline void prefetchw(const void __builtin_prefetch(ptr, 1, 3); } +#ifdef CONFIG_SMP extern inline void spin_lock_prefetch(const void *ptr) { __builtin_prefetch(ptr, 1, 3); } +#endif + #else extern inline void prefetch(const void *ptr) { @@ -104,10 +112,13 @@ extern inline void prefetchw(const void __asm__ ("ldq $31,%0" : : "m"(*(char *)ptr)); } +#ifdef CONFIG_SMP extern inline void spin_lock_prefetch(const void *ptr) { __asm__ ("ldq $31,%0" : : "m"(*(char *)ptr)); } +#endif + #endif /* GCC 3.1 */ #endif /* __ASM_ALPHA_PROCESSOR_H */ _