diff options
Diffstat (limited to 'include/asm-i386/spinlock.h')
| -rw-r--r-- | include/asm-i386/spinlock.h | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/include/asm-i386/spinlock.h b/include/asm-i386/spinlock.h index 23604350cdf4..d76b7693cf1d 100644 --- a/include/asm-i386/spinlock.h +++ b/include/asm-i386/spinlock.h | |||
| @@ -35,31 +35,41 @@ | |||
| 35 | #define __raw_spin_lock_string_flags \ | 35 | #define __raw_spin_lock_string_flags \ |
| 36 | "\n1:\t" \ | 36 | "\n1:\t" \ |
| 37 | "lock ; decb %0\n\t" \ | 37 | "lock ; decb %0\n\t" \ |
| 38 | "jns 4f\n\t" \ | 38 | "jns 5f\n" \ |
| 39 | "2:\t" \ | 39 | "2:\t" \ |
| 40 | "testl $0x200, %1\n\t" \ | 40 | "testl $0x200, %1\n\t" \ |
| 41 | "jz 3f\n\t" \ | 41 | "jz 4f\n\t" \ |
| 42 | "sti\n\t" \ | 42 | "sti\n" \ |
| 43 | "3:\t" \ | 43 | "3:\t" \ |
| 44 | "rep;nop\n\t" \ | 44 | "rep;nop\n\t" \ |
| 45 | "cmpb $0, %0\n\t" \ | 45 | "cmpb $0, %0\n\t" \ |
| 46 | "jle 3b\n\t" \ | 46 | "jle 3b\n\t" \ |
| 47 | "cli\n\t" \ | 47 | "cli\n\t" \ |
| 48 | "jmp 1b\n" \ | 48 | "jmp 1b\n" \ |
| 49 | "4:\n\t" | 49 | "4:\t" \ |
| 50 | "rep;nop\n\t" \ | ||
| 51 | "cmpb $0, %0\n\t" \ | ||
| 52 | "jg 1b\n\t" \ | ||
| 53 | "jmp 4b\n" \ | ||
| 54 | "5:\n\t" | ||
| 55 | |||
| 56 | #define __raw_spin_lock_string_up \ | ||
| 57 | "\n\tdecb %0" | ||
| 50 | 58 | ||
| 51 | static inline void __raw_spin_lock(raw_spinlock_t *lock) | 59 | static inline void __raw_spin_lock(raw_spinlock_t *lock) |
| 52 | { | 60 | { |
| 53 | __asm__ __volatile__( | 61 | alternative_smp( |
| 54 | __raw_spin_lock_string | 62 | __raw_spin_lock_string, |
| 55 | :"=m" (lock->slock) : : "memory"); | 63 | __raw_spin_lock_string_up, |
| 64 | "=m" (lock->slock) : : "memory"); | ||
| 56 | } | 65 | } |
| 57 | 66 | ||
| 58 | static inline void __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long flags) | 67 | static inline void __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long flags) |
| 59 | { | 68 | { |
| 60 | __asm__ __volatile__( | 69 | alternative_smp( |
| 61 | __raw_spin_lock_string_flags | 70 | __raw_spin_lock_string_flags, |
| 62 | :"=m" (lock->slock) : "r" (flags) : "memory"); | 71 | __raw_spin_lock_string_up, |
| 72 | "=m" (lock->slock) : "r" (flags) : "memory"); | ||
| 63 | } | 73 | } |
| 64 | 74 | ||
| 65 | static inline int __raw_spin_trylock(raw_spinlock_t *lock) | 75 | static inline int __raw_spin_trylock(raw_spinlock_t *lock) |
| @@ -178,12 +188,12 @@ static inline int __raw_write_trylock(raw_rwlock_t *lock) | |||
| 178 | 188 | ||
| 179 | static inline void __raw_read_unlock(raw_rwlock_t *rw) | 189 | static inline void __raw_read_unlock(raw_rwlock_t *rw) |
| 180 | { | 190 | { |
| 181 | asm volatile("lock ; incl %0" :"=m" (rw->lock) : : "memory"); | 191 | asm volatile(LOCK_PREFIX "incl %0" :"=m" (rw->lock) : : "memory"); |
| 182 | } | 192 | } |
| 183 | 193 | ||
| 184 | static inline void __raw_write_unlock(raw_rwlock_t *rw) | 194 | static inline void __raw_write_unlock(raw_rwlock_t *rw) |
| 185 | { | 195 | { |
| 186 | asm volatile("lock ; addl $" RW_LOCK_BIAS_STR ", %0" | 196 | asm volatile(LOCK_PREFIX "addl $" RW_LOCK_BIAS_STR ", %0" |
| 187 | : "=m" (rw->lock) : : "memory"); | 197 | : "=m" (rw->lock) : : "memory"); |
| 188 | } | 198 | } |
| 189 | 199 | ||
