diff options
| author | Michel Lespinasse <walken@google.com> | 2010-07-20 18:19:45 -0400 |
|---|---|---|
| committer | H. Peter Anvin <hpa@linux.intel.com> | 2010-07-20 20:41:14 -0400 |
| commit | b4bcb4c28c64cc2876b4aef218d992ce806194da (patch) | |
| tree | 54ecb062c7fa2cc71f64c24a4be6d198aebf86a9 | |
| parent | a751bd858b16dce57f3b6b85ba07946df1bd7be4 (diff) | |
x86, rwsem: Minor cleanups
Clarified few comments and made initialization of %edx/%rdx more uniform
accross __down_write_nested, __up_read and __up_write functions.
Signed-off-by: Michel Lespinasse <walken@google.com>
LKML-Reference: <201007202219.o6KMJkiA021048@imap1.linux-foundation.org>
Acked-by: David Howells <dhowells@redhat.com>
Cc: Mike Waychison <mikew@google.com>
Cc: Suleiman Souhlal <suleiman@google.com>
Cc: Ying Han <yinghan@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
| -rw-r--r-- | arch/x86/include/asm/rwsem.h | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/arch/x86/include/asm/rwsem.h b/arch/x86/include/asm/rwsem.h index 5bf5e04e497f..d1e41b0f9b60 100644 --- a/arch/x86/include/asm/rwsem.h +++ b/arch/x86/include/asm/rwsem.h | |||
| @@ -118,7 +118,7 @@ static inline void __down_read(struct rw_semaphore *sem) | |||
| 118 | { | 118 | { |
| 119 | asm volatile("# beginning down_read\n\t" | 119 | asm volatile("# beginning down_read\n\t" |
| 120 | LOCK_PREFIX _ASM_INC "(%1)\n\t" | 120 | LOCK_PREFIX _ASM_INC "(%1)\n\t" |
| 121 | /* adds 0x00000001, returns the old value */ | 121 | /* adds 0x00000001 */ |
| 122 | " jns 1f\n" | 122 | " jns 1f\n" |
| 123 | " call call_rwsem_down_read_failed\n" | 123 | " call call_rwsem_down_read_failed\n" |
| 124 | "1:\n\t" | 124 | "1:\n\t" |
| @@ -156,11 +156,9 @@ static inline int __down_read_trylock(struct rw_semaphore *sem) | |||
| 156 | static inline void __down_write_nested(struct rw_semaphore *sem, int subclass) | 156 | static inline void __down_write_nested(struct rw_semaphore *sem, int subclass) |
| 157 | { | 157 | { |
| 158 | rwsem_count_t tmp; | 158 | rwsem_count_t tmp; |
| 159 | |||
| 160 | tmp = RWSEM_ACTIVE_WRITE_BIAS; | ||
| 161 | asm volatile("# beginning down_write\n\t" | 159 | asm volatile("# beginning down_write\n\t" |
| 162 | LOCK_PREFIX " xadd %1,(%2)\n\t" | 160 | LOCK_PREFIX " xadd %1,(%2)\n\t" |
| 163 | /* subtract 0x0000ffff, returns the old value */ | 161 | /* adds 0xffff0001, returns the old value */ |
| 164 | " test %1,%1\n\t" | 162 | " test %1,%1\n\t" |
| 165 | /* was the count 0 before? */ | 163 | /* was the count 0 before? */ |
| 166 | " jz 1f\n" | 164 | " jz 1f\n" |
| @@ -168,7 +166,7 @@ static inline void __down_write_nested(struct rw_semaphore *sem, int subclass) | |||
| 168 | "1:\n" | 166 | "1:\n" |
| 169 | "# ending down_write" | 167 | "# ending down_write" |
| 170 | : "+m" (sem->count), "=d" (tmp) | 168 | : "+m" (sem->count), "=d" (tmp) |
| 171 | : "a" (sem), "1" (tmp) | 169 | : "a" (sem), "1" (RWSEM_ACTIVE_WRITE_BIAS) |
| 172 | : "memory", "cc"); | 170 | : "memory", "cc"); |
| 173 | } | 171 | } |
| 174 | 172 | ||
| @@ -195,16 +193,16 @@ static inline int __down_write_trylock(struct rw_semaphore *sem) | |||
| 195 | */ | 193 | */ |
| 196 | static inline void __up_read(struct rw_semaphore *sem) | 194 | static inline void __up_read(struct rw_semaphore *sem) |
| 197 | { | 195 | { |
| 198 | rwsem_count_t tmp = -RWSEM_ACTIVE_READ_BIAS; | 196 | rwsem_count_t tmp; |
| 199 | asm volatile("# beginning __up_read\n\t" | 197 | asm volatile("# beginning __up_read\n\t" |
| 200 | LOCK_PREFIX " xadd %1,(%2)\n\t" | 198 | LOCK_PREFIX " xadd %1,(%2)\n\t" |
| 201 | /* subtracts 1, returns the old value */ | 199 | /* subtracts 1, returns the old value */ |
| 202 | " jns 1f\n\t" | 200 | " jns 1f\n\t" |
| 203 | " call call_rwsem_wake\n" | 201 | " call call_rwsem_wake\n" /* expects old value in %edx */ |
| 204 | "1:\n" | 202 | "1:\n" |
| 205 | "# ending __up_read\n" | 203 | "# ending __up_read\n" |
| 206 | : "+m" (sem->count), "=d" (tmp) | 204 | : "+m" (sem->count), "=d" (tmp) |
| 207 | : "a" (sem), "1" (tmp) | 205 | : "a" (sem), "1" (-RWSEM_ACTIVE_READ_BIAS) |
| 208 | : "memory", "cc"); | 206 | : "memory", "cc"); |
| 209 | } | 207 | } |
| 210 | 208 | ||
| @@ -218,7 +216,7 @@ static inline void __up_write(struct rw_semaphore *sem) | |||
| 218 | LOCK_PREFIX " xadd %1,(%2)\n\t" | 216 | LOCK_PREFIX " xadd %1,(%2)\n\t" |
| 219 | /* subtracts 0xffff0001, returns the old value */ | 217 | /* subtracts 0xffff0001, returns the old value */ |
| 220 | " jns 1f\n\t" | 218 | " jns 1f\n\t" |
| 221 | " call call_rwsem_wake\n" | 219 | " call call_rwsem_wake\n" /* expects old value in %edx */ |
| 222 | "1:\n\t" | 220 | "1:\n\t" |
| 223 | "# ending __up_write\n" | 221 | "# ending __up_write\n" |
| 224 | : "+m" (sem->count), "=d" (tmp) | 222 | : "+m" (sem->count), "=d" (tmp) |
