Commit a79f0da8 authored by Eric Dumazet's avatar Eric Dumazet Committed by Ingo Molnar

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: default avatarEric 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: default avatarIngo Molnar <mingo@elte.hu>
parent ddf9a003
...@@ -295,6 +295,28 @@ extern void atomic64_set(atomic64_t *ptr, u64 new_val); ...@@ -295,6 +295,28 @@ extern void atomic64_set(atomic64_t *ptr, u64 new_val);
* *
* Atomically reads the value of @ptr and returns it. * Atomically reads the value of @ptr and returns it.
*/ */
static inline u64 atomic64_read(atomic64_t *ptr)
{
u64 res;
/*
* Note, we inline this atomic64_t primitive because
* it only clobbers EAX/EDX and leaves the others
* untouched. We also (somewhat subtly) rely on the
* fact that cmpxchg8b returns the current 64-bit value
* of the memory location we are touching:
*/
asm volatile(
"mov %%ebx, %%eax\n\t"
"mov %%ecx, %%edx\n\t"
LOCK_PREFIX "cmpxchg8b %1\n"
: "=&A" (res)
: "m" (*ptr)
);
return res;
}
extern u64 atomic64_read(atomic64_t *ptr); extern u64 atomic64_read(atomic64_t *ptr);
/** /**
......
...@@ -66,31 +66,10 @@ void atomic64_set(atomic64_t *ptr, u64 new_val) ...@@ -66,31 +66,10 @@ void atomic64_set(atomic64_t *ptr, u64 new_val)
{ {
atomic64_xchg(ptr, new_val); atomic64_xchg(ptr, new_val);
} }
EXPORT_SYMBOL(atomic64_read); EXPORT_SYMBOL(atomic64_set);
/** /**
* atomic64_read - read atomic64 variable
* @ptr: pointer to type atomic64_t
*
* Atomically reads the value of @ptr and returns it.
*/
u64 atomic64_read(atomic64_t *ptr)
{
u64 res;
asm volatile(
"mov %%ebx, %%eax\n\t"
"mov %%ecx, %%edx\n\t"
LOCK_PREFIX "cmpxchg8b %1\n"
: "+A" (res)
: "m" (*ptr)
);
return res;
}
EXPORT_SYMBOL(atomic64_read); EXPORT_SYMBOL(atomic64_read);
/**
* atomic64_add_return - add and return * atomic64_add_return - add and return
* @delta: integer value to add * @delta: integer value to add
* @ptr: pointer to type atomic64_t * @ptr: pointer to type atomic64_t
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment