Commit 3ab88352 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] Alpha: make prefetch_spinlock() a no-op on UP

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.
parent 68cfa179
...@@ -78,6 +78,11 @@ unsigned long get_wchan(struct task_struct *p); ...@@ -78,6 +78,11 @@ unsigned long get_wchan(struct task_struct *p);
#define ARCH_HAS_PREFETCHW #define ARCH_HAS_PREFETCHW
#define ARCH_HAS_SPINLOCK_PREFETCH #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) #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
extern inline void prefetch(const void *ptr) extern inline void prefetch(const void *ptr)
{ {
...@@ -89,10 +94,13 @@ extern inline void prefetchw(const void *ptr) ...@@ -89,10 +94,13 @@ extern inline void prefetchw(const void *ptr)
__builtin_prefetch(ptr, 1, 3); __builtin_prefetch(ptr, 1, 3);
} }
#ifdef CONFIG_SMP
extern inline void spin_lock_prefetch(const void *ptr) extern inline void spin_lock_prefetch(const void *ptr)
{ {
__builtin_prefetch(ptr, 1, 3); __builtin_prefetch(ptr, 1, 3);
} }
#endif
#else #else
extern inline void prefetch(const void *ptr) extern inline void prefetch(const void *ptr)
{ {
...@@ -104,10 +112,13 @@ extern inline void prefetchw(const void *ptr) ...@@ -104,10 +112,13 @@ extern inline void prefetchw(const void *ptr)
__asm__ ("ldq $31,%0" : : "m"(*(char *)ptr)); __asm__ ("ldq $31,%0" : : "m"(*(char *)ptr));
} }
#ifdef CONFIG_SMP
extern inline void spin_lock_prefetch(const void *ptr) extern inline void spin_lock_prefetch(const void *ptr)
{ {
__asm__ ("ldq $31,%0" : : "m"(*(char *)ptr)); __asm__ ("ldq $31,%0" : : "m"(*(char *)ptr));
} }
#endif
#endif /* GCC 3.1 */ #endif /* GCC 3.1 */
#endif /* __ASM_ALPHA_PROCESSOR_H */ #endif /* __ASM_ALPHA_PROCESSOR_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment