Re: [PATCH -tip] x86: atomic64: inline atomic64_read()

From: Ingo Molnar
Date: Fri Jul 03 2009 - 14:05:12 EST



* Eric Dumazet <eric.dumazet@xxxxxxxxx> wrote:

> 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

ok, but:

> +static inline 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)
> + );

That clobbers or affects eax, ebx, ecx, edx. The only registers it
does not clobber is esi, edi and rbp.

So it's not quite lightweight. But your patch reduced the kernel
image size by 17 bytes so i guess it counts as an improvement - and
we also avoid function calls.

Linus, what's your preference in this case?

Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/