diff options
| author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2011-02-17 07:13:58 -0500 |
|---|---|---|
| committer | Martin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com> | 2011-02-17 07:13:59 -0500 |
| commit | 7657e41a0bd16c9d8b3cefe8fd5d6ac3c25ae4bf (patch) | |
| tree | bbc5ee1777320f332820c566a33e943c3d5b27e8 | |
| parent | a8c8d7c683419d059e302373afc6998244f5f60f (diff) | |
[S390] atomic: use inline asm
Use inline assemblies for atomic_read/set(). This way there shouldn't
be any questions or subtle volatile semantics left.
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
| -rw-r--r-- | arch/s390/include/asm/atomic.h | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/arch/s390/include/asm/atomic.h b/arch/s390/include/asm/atomic.h index 50cfb5ed601b..5c5ba10384c2 100644 --- a/arch/s390/include/asm/atomic.h +++ b/arch/s390/include/asm/atomic.h | |||
| @@ -36,12 +36,19 @@ | |||
| 36 | 36 | ||
| 37 | static inline int atomic_read(const atomic_t *v) | 37 | static inline int atomic_read(const atomic_t *v) |
| 38 | { | 38 | { |
| 39 | return ACCESS_ONCE(v->counter); | 39 | int c; |
| 40 | |||
| 41 | asm volatile( | ||
| 42 | " l %0,%1\n" | ||
| 43 | : "=d" (c) : "Q" (v->counter)); | ||
| 44 | return c; | ||
| 40 | } | 45 | } |
| 41 | 46 | ||
| 42 | static inline void atomic_set(atomic_t *v, int i) | 47 | static inline void atomic_set(atomic_t *v, int i) |
| 43 | { | 48 | { |
| 44 | v->counter = i; | 49 | asm volatile( |
| 50 | " st %1,%0\n" | ||
| 51 | : "=Q" (v->counter) : "d" (i)); | ||
| 45 | } | 52 | } |
| 46 | 53 | ||
| 47 | static inline int atomic_add_return(int i, atomic_t *v) | 54 | static inline int atomic_add_return(int i, atomic_t *v) |
| @@ -126,12 +133,19 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u) | |||
| 126 | 133 | ||
| 127 | static inline long long atomic64_read(const atomic64_t *v) | 134 | static inline long long atomic64_read(const atomic64_t *v) |
| 128 | { | 135 | { |
| 129 | return ACCESS_ONCE(v->counter); | 136 | long long c; |
| 137 | |||
| 138 | asm volatile( | ||
| 139 | " lg %0,%1\n" | ||
| 140 | : "=d" (c) : "Q" (v->counter)); | ||
| 141 | return c; | ||
| 130 | } | 142 | } |
| 131 | 143 | ||
| 132 | static inline void atomic64_set(atomic64_t *v, long long i) | 144 | static inline void atomic64_set(atomic64_t *v, long long i) |
| 133 | { | 145 | { |
| 134 | v->counter = i; | 146 | asm volatile( |
| 147 | " stg %1,%0\n" | ||
| 148 | : "=Q" (v->counter) : "d" (i)); | ||
| 135 | } | 149 | } |
| 136 | 150 | ||
| 137 | static inline long long atomic64_add_return(long long i, atomic64_t *v) | 151 | static inline long long atomic64_add_return(long long i, atomic64_t *v) |
