diff options
Diffstat (limited to 'include/asm-i386/spinlock.h')
-rw-r--r-- | include/asm-i386/spinlock.h | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/include/asm-i386/spinlock.h b/include/asm-i386/spinlock.h index 23604350cdf4..a1b8a8a30e21 100644 --- a/include/asm-i386/spinlock.h +++ b/include/asm-i386/spinlock.h | |||
@@ -48,18 +48,23 @@ | |||
48 | "jmp 1b\n" \ | 48 | "jmp 1b\n" \ |
49 | "4:\n\t" | 49 | "4:\n\t" |
50 | 50 | ||
51 | #define __raw_spin_lock_string_up \ | ||
52 | "\n\tdecb %0" | ||
53 | |||
51 | static inline void __raw_spin_lock(raw_spinlock_t *lock) | 54 | static inline void __raw_spin_lock(raw_spinlock_t *lock) |
52 | { | 55 | { |
53 | __asm__ __volatile__( | 56 | alternative_smp( |
54 | __raw_spin_lock_string | 57 | __raw_spin_lock_string, |
55 | :"=m" (lock->slock) : : "memory"); | 58 | __raw_spin_lock_string_up, |
59 | "=m" (lock->slock) : : "memory"); | ||
56 | } | 60 | } |
57 | 61 | ||
58 | static inline void __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long flags) | 62 | static inline void __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long flags) |
59 | { | 63 | { |
60 | __asm__ __volatile__( | 64 | alternative_smp( |
61 | __raw_spin_lock_string_flags | 65 | __raw_spin_lock_string_flags, |
62 | :"=m" (lock->slock) : "r" (flags) : "memory"); | 66 | __raw_spin_lock_string_up, |
67 | "=m" (lock->slock) : "r" (flags) : "memory"); | ||
63 | } | 68 | } |
64 | 69 | ||
65 | static inline int __raw_spin_trylock(raw_spinlock_t *lock) | 70 | static inline int __raw_spin_trylock(raw_spinlock_t *lock) |
@@ -178,12 +183,12 @@ static inline int __raw_write_trylock(raw_rwlock_t *lock) | |||
178 | 183 | ||
179 | static inline void __raw_read_unlock(raw_rwlock_t *rw) | 184 | static inline void __raw_read_unlock(raw_rwlock_t *rw) |
180 | { | 185 | { |
181 | asm volatile("lock ; incl %0" :"=m" (rw->lock) : : "memory"); | 186 | asm volatile(LOCK_PREFIX "incl %0" :"=m" (rw->lock) : : "memory"); |
182 | } | 187 | } |
183 | 188 | ||
184 | static inline void __raw_write_unlock(raw_rwlock_t *rw) | 189 | static inline void __raw_write_unlock(raw_rwlock_t *rw) |
185 | { | 190 | { |
186 | asm volatile("lock ; addl $" RW_LOCK_BIAS_STR ", %0" | 191 | asm volatile(LOCK_PREFIX "addl $" RW_LOCK_BIAS_STR ", %0" |
187 | : "=m" (rw->lock) : : "memory"); | 192 | : "=m" (rw->lock) : : "memory"); |
188 | } | 193 | } |
189 | 194 | ||