* [patch 0/2] use asm() for atomic_{read|set} (shot 2)
@ 2007-08-15 20:54 Sebastian Siewior
2007-08-15 20:54 ` [patch 1/2] i386: use asm() like the other atomic operations already do Sebastian Siewior
2007-08-15 20:54 ` [patch 2/2] x86_64: " Sebastian Siewior
0 siblings, 2 replies; 4+ messages in thread
From: Sebastian Siewior @ 2007-08-15 20:54 UTC (permalink / raw)
To: linux-kernel; +Cc: Andi Kleen, Chris Snook
Diff to last post:
- no __*__ functions used.
- no white space fixes.
I converted i386+x86-64 arch. The description of both patches contains the
file size of four kernel builds:
- "normal" is 28e8351ac22de25034e048c680014ad824323c65 as it
- "inline asm" is with this patch
- "inline volatile" is *(volatile int *)&(v)->counter as a static inline
function
- "volatile" is *(volatile int *)&(v)->counter as a #define macro
Sebastian
--
^ permalink raw reply [flat|nested] 4+ messages in thread* [patch 1/2] i386: use asm() like the other atomic operations already do. 2007-08-15 20:54 [patch 0/2] use asm() for atomic_{read|set} (shot 2) Sebastian Siewior @ 2007-08-15 20:54 ` Sebastian Siewior 2007-08-15 20:54 ` [patch 2/2] x86_64: " Sebastian Siewior 1 sibling, 0 replies; 4+ messages in thread From: Sebastian Siewior @ 2007-08-15 20:54 UTC (permalink / raw) To: linux-kernel; +Cc: Andi Kleen, Chris Snook [-- Attachment #1: atomic_i386.diff --] [-- Type: text/plain, Size: 1648 bytes --] As Segher pointed out, inline asm is better than the volatile casting all over the place. From the PowerPC patch description: Also use inline functions instead of macros; this actually improves code generation (some code becomes a little smaller, probably because of improved alias information -- just a few hundred bytes total on a default kernel build, nothing shocking). My config with march=pentium-m and gcc (GCC) 4.1.2 (Gentoo 4.1.2): text data bss dec hex filename 3434150 249176 176128 3859454 3ae3fe atomic_normal/vmlinux 3435308 249176 176128 3860612 3ae884 atomic_inlineasm/vmlinux 3436201 249176 176128 3861505 3aec01 atomic_inline_volatile/vmlinux 3436203 249176 176128 3861507 3aec03 atomic_volatile/vmlinux Signed-off-by: Sebastian Siewior <sebastian@breakpoint.cc> Cc: Andi Kleen <ak@suse.de> Cc: Chris Snook <csnook@redhat.com> --- a/include/asm-i386/atomic.h +++ b/include/asm-i386/atomic.h @@ -25,7 +25,16 @@ typedef struct { int counter; } atomic_t * * Atomically reads the value of @v. */ -#define atomic_read(v) ((v)->counter) +static inline int atomic_read(const atomic_t *v) +{ + int t; + + asm volatile( + "movl %1,%0" + : "=r"(t) + : "m"(v->counter)); + return t; +} /** * atomic_set - set atomic variable @@ -34,7 +43,13 @@ typedef struct { int counter; } atomic_t * * Atomically sets the value of @v to @i. */ -#define atomic_set(v,i) (((v)->counter) = (i)) +static inline void atomic_set(atomic_t *v, int i) +{ + asm volatile( + "movl %1,%0" + : "=m"(v->counter) + : "ir"(i)); +} /** * atomic_add - add integer to atomic variable -- ^ permalink raw reply [flat|nested] 4+ messages in thread
* [patch 2/2] x86_64: use asm() like the other atomic operations already do. 2007-08-15 20:54 [patch 0/2] use asm() for atomic_{read|set} (shot 2) Sebastian Siewior 2007-08-15 20:54 ` [patch 1/2] i386: use asm() like the other atomic operations already do Sebastian Siewior @ 2007-08-15 20:54 ` Sebastian Siewior 1 sibling, 0 replies; 4+ messages in thread From: Sebastian Siewior @ 2007-08-15 20:54 UTC (permalink / raw) To: linux-kernel; +Cc: Andi Kleen, Chris Snook [-- Attachment #1: atomic_x86_64.diff --] [-- Type: text/plain, Size: 2631 bytes --] As Segher pointed out, inline asm is better than the volatile casting all over the place. From the PowerPC patch description: Also use inline functions instead of macros; this actually improves code generation (some code becomes a little smaller, probably because of improved alias information -- just a few hundred bytes total on a default kernel build, nothing shocking). My config with march=k8 and gcc (GCC) 4.1.2 (Gentoo 4.1.2): text data bss dec hex filename 4002473 385936 474440 4862849 4a3381 atomic_normal/vmlinux 4002587 385936 474440 4862963 4a33f3 atomic_inlineasm/vmlinux 4003911 385936 474440 4864287 4a391f atomic_volatile/vmlinux 4003959 385936 474440 4864335 4a394f atomic_volatile_inline/vmlinux Signed-off-by: Sebastian Siewior <sebastian@breakpoint.cc> Cc: Andi Kleen <ak@suse.de> Cc: Chris Snook <csnook@redhat.com> --- a/include/asm-x86_64/atomic.h +++ b/include/asm-x86_64/atomic.h @@ -32,7 +32,16 @@ typedef struct { int counter; } atomic_t * * Atomically reads the value of @v. */ -#define atomic_read(v) ((v)->counter) +static inline int atomic_read(const atomic_t *v) +{ + int t; + + asm volatile( + "movl %1, %0" + : "=r"(t) + : "m"(v->counter)); + return t; +} /** * atomic_set - set atomic variable @@ -41,7 +50,13 @@ typedef struct { int counter; } atomic_t * * Atomically sets the value of @v to @i. */ -#define atomic_set(v,i) (((v)->counter) = (i)) +static inline void atomic_set(atomic_t *v, int i) +{ + asm volatile( + "movl %1, %0" + : "=m"(v->counter) + : "ir"(i)); +} /** * atomic_add - add integer to atomic variable @@ -206,7 +221,7 @@ static __inline__ int atomic_sub_return( /* An 64bit atomic type */ -typedef struct { volatile long counter; } atomic64_t; +typedef struct { long counter; } atomic64_t; #define ATOMIC64_INIT(i) { (i) } @@ -217,7 +232,16 @@ typedef struct { volatile long counter; * Atomically reads the value of @v. * Doesn't imply a read memory barrier. */ -#define atomic64_read(v) ((v)->counter) +static inline long atomic64_read(const atomic64_t *v) +{ + long t; + + asm volatile( + "movq %1, %0" + : "=r"(t) + : "m"(v->counter)); + return t; +} /** * atomic64_set - set atomic64 variable @@ -226,7 +250,13 @@ typedef struct { volatile long counter; * * Atomically sets the value of @v to @i. */ -#define atomic64_set(v,i) (((v)->counter) = (i)) +static inline void atomic64_set(atomic64_t *v, long i) +{ + asm volatile( + "movq %1, %0" + : "=m"(v->counter) + : "ir"(i)); +} /** * atomic64_add - add integer to atomic64 variable -- ^ permalink raw reply [flat|nested] 4+ messages in thread
* [patch 0/2] use asm() for atomic_{read|set}
@ 2007-08-14 22:38 Sebastian Siewior
2007-08-14 22:38 ` [patch 2/2] x86_64: use asm() like the other atomic operations already do Sebastian Siewior
0 siblings, 1 reply; 4+ messages in thread
From: Sebastian Siewior @ 2007-08-14 22:38 UTC (permalink / raw)
To: linux-kernel; +Cc: Andi Kleen
I converted i386+x86-64. Compiled, booted and played for a while. The
description of both patches contains the file size of four kernel builds:
- "normal" is 28e8351ac22de25034e048c680014ad824323c65 as it
- "inline asm" is with this patch
- "inline volatile" is *(volatile int *)&(v)->counter as a static inline
function
- "volatile" is *(volatile int *)&(v)->counter as a #define macro
I hope I don't encourage anyone to use macros over inline functions.
Sebastian
--
^ permalink raw reply [flat|nested] 4+ messages in thread* [patch 2/2] x86_64: use asm() like the other atomic operations already do. 2007-08-14 22:38 [patch 0/2] use asm() for atomic_{read|set} Sebastian Siewior @ 2007-08-14 22:38 ` Sebastian Siewior 0 siblings, 0 replies; 4+ messages in thread From: Sebastian Siewior @ 2007-08-14 22:38 UTC (permalink / raw) To: linux-kernel; +Cc: Andi Kleen [-- Attachment #1: atomic_x86_64.diff --] [-- Type: text/plain, Size: 2707 bytes --] As Segher pointed out, inline asm is better than the volatile casting all over the place. From the PowerPC patch description: Also use inline functions instead of macros; this actually improves code generation (some code becomes a little smaller, probably because of improved alias information -- just a few hundred bytes total on a default kernel build, nothing shocking). My config with march=k8 and gcc (GCC) 4.1.2 (Gentoo 4.1.2): text data bss dec hex filename 4002473 385936 474440 4862849 4a3381 atomic_normal/vmlinux 4002587 385936 474440 4862963 4a33f3 atomic_inlineasm/vmlinux 4003911 385936 474440 4864287 4a391f atomic_volatile/vmlinux 4003959 385936 474440 4864335 4a394f atomic_volatile_inline/vmlinux Signed-off-by: Sebastian Siewior <sebastian@breakpoint.cc> --- a/include/asm-x86_64/atomic.h +++ b/include/asm-x86_64/atomic.h @@ -29,19 +29,34 @@ typedef struct { int counter; } atomic_t /** * atomic_read - read atomic variable * @v: pointer of type atomic_t - * + * * Atomically reads the value of @v. - */ -#define atomic_read(v) ((v)->counter) + */ +static __inline__ int atomic_read(const atomic_t *v) +{ + int t; + + __asm__ __volatile__( + "movl %1, %0" + : "=r"(t) + : "m"(v->counter)); + return t; +} /** * atomic_set - set atomic variable * @v: pointer of type atomic_t * @i: required value - * + * * Atomically sets the value of @v to @i. - */ -#define atomic_set(v,i) (((v)->counter) = (i)) + */ +static __inline__ void atomic_set(atomic_t *v, int i) +{ + __asm__ __volatile__( + "movl %1, %0" + : "=m"(v->counter) + : "ir"(i)); +} /** * atomic_add - add integer to atomic variable @@ -206,7 +221,7 @@ static __inline__ int atomic_sub_return( /* An 64bit atomic type */ -typedef struct { volatile long counter; } atomic64_t; +typedef struct { long counter; } atomic64_t; #define ATOMIC64_INIT(i) { (i) } @@ -217,7 +232,16 @@ typedef struct { volatile long counter; * Atomically reads the value of @v. * Doesn't imply a read memory barrier. */ -#define atomic64_read(v) ((v)->counter) +static __inline__ long atomic64_read(const atomic64_t *v) +{ + long t; + + __asm__ __volatile__( + "movq %1, %0" + : "=r"(t) + : "m"(v->counter)); + return t; +} /** * atomic64_set - set atomic64 variable @@ -226,7 +250,13 @@ typedef struct { volatile long counter; * * Atomically sets the value of @v to @i. */ -#define atomic64_set(v,i) (((v)->counter) = (i)) +static __inline__ void atomic64_set(atomic64_t *v, long i) +{ + __asm__ __volatile__( + "movq %1, %0" + : "=m"(v->counter) + : "ir"(i)); +} /** * atomic64_add - add integer to atomic64 variable -- ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2007-08-16 7:18 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-08-15 20:54 [patch 0/2] use asm() for atomic_{read|set} (shot 2) Sebastian Siewior
2007-08-15 20:54 ` [patch 1/2] i386: use asm() like the other atomic operations already do Sebastian Siewior
2007-08-15 20:54 ` [patch 2/2] x86_64: " Sebastian Siewior
-- strict thread matches above, loose matches on Subject: below --
2007-08-14 22:38 [patch 0/2] use asm() for atomic_{read|set} Sebastian Siewior
2007-08-14 22:38 ` [patch 2/2] x86_64: use asm() like the other atomic operations already do Sebastian Siewior
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
Powered by JetHome