
From: Ivan Kokshaysky <ink@jurassic.park.msu.ru>

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 */

_
