diff options
author | Andi Kleen <ak@suse.de> | 2005-11-05 11:25:54 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-14 22:55:15 -0500 |
commit | 485832a5d928facd82f1525270d9f048da2063a1 (patch) | |
tree | 4266c612f32c2ccaca080af00cfee3a9f420331c | |
parent | 8315eca25583c369e28f48909d3341dc21d6214d (diff) |
[PATCH] x86_64: Use int operations in spinlocks to support more than 128 CPUs spinning.
Pointed out by Eric Dumazet
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | include/asm-x86_64/spinlock.h | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/include/asm-x86_64/spinlock.h b/include/asm-x86_64/spinlock.h index 69636831ad2f..fe484a699cc3 100644 --- a/include/asm-x86_64/spinlock.h +++ b/include/asm-x86_64/spinlock.h | |||
@@ -18,22 +18,22 @@ | |||
18 | */ | 18 | */ |
19 | 19 | ||
20 | #define __raw_spin_is_locked(x) \ | 20 | #define __raw_spin_is_locked(x) \ |
21 | (*(volatile signed char *)(&(x)->slock) <= 0) | 21 | (*(volatile signed int *)(&(x)->slock) <= 0) |
22 | 22 | ||
23 | #define __raw_spin_lock_string \ | 23 | #define __raw_spin_lock_string \ |
24 | "\n1:\t" \ | 24 | "\n1:\t" \ |
25 | "lock ; decb %0\n\t" \ | 25 | "lock ; decl %0\n\t" \ |
26 | "js 2f\n" \ | 26 | "js 2f\n" \ |
27 | LOCK_SECTION_START("") \ | 27 | LOCK_SECTION_START("") \ |
28 | "2:\t" \ | 28 | "2:\t" \ |
29 | "rep;nop\n\t" \ | 29 | "rep;nop\n\t" \ |
30 | "cmpb $0,%0\n\t" \ | 30 | "cmpl $0,%0\n\t" \ |
31 | "jle 2b\n\t" \ | 31 | "jle 2b\n\t" \ |
32 | "jmp 1b\n" \ | 32 | "jmp 1b\n" \ |
33 | LOCK_SECTION_END | 33 | LOCK_SECTION_END |
34 | 34 | ||
35 | #define __raw_spin_unlock_string \ | 35 | #define __raw_spin_unlock_string \ |
36 | "movb $1,%0" \ | 36 | "movl $1,%0" \ |
37 | :"=m" (lock->slock) : : "memory" | 37 | :"=m" (lock->slock) : : "memory" |
38 | 38 | ||
39 | static inline void __raw_spin_lock(raw_spinlock_t *lock) | 39 | static inline void __raw_spin_lock(raw_spinlock_t *lock) |
@@ -47,10 +47,10 @@ static inline void __raw_spin_lock(raw_spinlock_t *lock) | |||
47 | 47 | ||
48 | static inline int __raw_spin_trylock(raw_spinlock_t *lock) | 48 | static inline int __raw_spin_trylock(raw_spinlock_t *lock) |
49 | { | 49 | { |
50 | char oldval; | 50 | int oldval; |
51 | 51 | ||
52 | __asm__ __volatile__( | 52 | __asm__ __volatile__( |
53 | "xchgb %b0,%1" | 53 | "xchgl %0,%1" |
54 | :"=q" (oldval), "=m" (lock->slock) | 54 | :"=q" (oldval), "=m" (lock->slock) |
55 | :"0" (0) : "memory"); | 55 | :"0" (0) : "memory"); |
56 | 56 | ||