diff options
| author | Eric Dumazet <eric.dumazet@gmail.com> | 2009-07-03 10:50:10 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-07-04 05:45:00 -0400 |
| commit | a79f0da80a508448434476b77f9d3d1a469eab67 (patch) | |
| tree | 1bf9c72a09d266d874a2e8f7c94fd81e8ad27feb | |
| parent | ddf9a003d32f720805ac30bcc15755e9289073de (diff) | |
x86: atomic64: Inline atomic64_read() again
Now atomic64_read() is light weight (no register pressure and
small icache), we can inline it again.
Also use "=&A" constraint instead of "+A" to avoid warning
about unitialized 'res' variable. (gcc had to force 0 in eax/edx)
$ size vmlinux.prev vmlinux.after
text data bss dec hex filename
4908667 451676 1684868 7045211 6b805b vmlinux.prev
4908651 451676 1684868 7045195 6b804b vmlinux.after
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: David Howells <dhowells@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Arnd Bergmann <arnd@arndb.de>
LKML-Reference: <4A4E1AA2.30002@gmail.com>
[ Also fix typo in atomic64_set() export ]
Signed-off-by: Ingo Molnar <mingo@elte.hu>
| -rw-r--r-- | arch/x86/include/asm/atomic_32.h | 22 | ||||
| -rw-r--r-- | arch/x86/lib/atomic64_32.c | 23 |
2 files changed, 23 insertions, 22 deletions
diff --git a/arch/x86/include/asm/atomic_32.h b/arch/x86/include/asm/atomic_32.h index d7c8849b8c67..dc5a667ff791 100644 --- a/arch/x86/include/asm/atomic_32.h +++ b/arch/x86/include/asm/atomic_32.h | |||
| @@ -295,6 +295,28 @@ extern void atomic64_set(atomic64_t *ptr, u64 new_val); | |||
| 295 | * | 295 | * |
| 296 | * Atomically reads the value of @ptr and returns it. | 296 | * Atomically reads the value of @ptr and returns it. |
| 297 | */ | 297 | */ |
| 298 | static inline u64 atomic64_read(atomic64_t *ptr) | ||
| 299 | { | ||
| 300 | u64 res; | ||
| 301 | |||
| 302 | /* | ||
| 303 | * Note, we inline this atomic64_t primitive because | ||
| 304 | * it only clobbers EAX/EDX and leaves the others | ||
| 305 | * untouched. We also (somewhat subtly) rely on the | ||
| 306 | * fact that cmpxchg8b returns the current 64-bit value | ||
| 307 | * of the memory location we are touching: | ||
| 308 | */ | ||
| 309 | asm volatile( | ||
| 310 | "mov %%ebx, %%eax\n\t" | ||
| 311 | "mov %%ecx, %%edx\n\t" | ||
| 312 | LOCK_PREFIX "cmpxchg8b %1\n" | ||
| 313 | : "=&A" (res) | ||
| 314 | : "m" (*ptr) | ||
| 315 | ); | ||
| 316 | |||
| 317 | return res; | ||
| 318 | } | ||
| 319 | |||
| 298 | extern u64 atomic64_read(atomic64_t *ptr); | 320 | extern u64 atomic64_read(atomic64_t *ptr); |
| 299 | 321 | ||
| 300 | /** | 322 | /** |
diff --git a/arch/x86/lib/atomic64_32.c b/arch/x86/lib/atomic64_32.c index 1d98c9eb6eac..824fa0be55a3 100644 --- a/arch/x86/lib/atomic64_32.c +++ b/arch/x86/lib/atomic64_32.c | |||
| @@ -66,31 +66,10 @@ void atomic64_set(atomic64_t *ptr, u64 new_val) | |||
| 66 | { | 66 | { |
| 67 | atomic64_xchg(ptr, new_val); | 67 | atomic64_xchg(ptr, new_val); |
| 68 | } | 68 | } |
| 69 | EXPORT_SYMBOL(atomic64_read); | 69 | EXPORT_SYMBOL(atomic64_set); |
| 70 | 70 | ||
| 71 | /** | 71 | /** |
| 72 | * atomic64_read - read atomic64 variable | ||
| 73 | * @ptr: pointer to type atomic64_t | ||
| 74 | * | ||
| 75 | * Atomically reads the value of @ptr and returns it. | ||
| 76 | */ | ||
| 77 | u64 atomic64_read(atomic64_t *ptr) | ||
| 78 | { | ||
| 79 | u64 res; | ||
| 80 | |||
| 81 | asm volatile( | ||
| 82 | "mov %%ebx, %%eax\n\t" | ||
| 83 | "mov %%ecx, %%edx\n\t" | ||
| 84 | LOCK_PREFIX "cmpxchg8b %1\n" | ||
| 85 | : "+A" (res) | ||
| 86 | : "m" (*ptr) | ||
| 87 | ); | ||
| 88 | |||
| 89 | return res; | ||
| 90 | } | ||
| 91 | EXPORT_SYMBOL(atomic64_read); | 72 | EXPORT_SYMBOL(atomic64_read); |
| 92 | |||
| 93 | /** | ||
| 94 | * atomic64_add_return - add and return | 73 | * atomic64_add_return - add and return |
| 95 | * @delta: integer value to add | 74 | * @delta: integer value to add |
| 96 | * @ptr: pointer to type atomic64_t | 75 | * @ptr: pointer to type atomic64_t |
