[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>

authored by Heiko Carstens and committed by Martin Schwidefsky 7657e41a a8c8d7c6

+18 -4
+18 -4
arch/s390/include/asm/atomic.h
··· 36 37 static inline int atomic_read(const atomic_t *v) 38 { 39 - return ACCESS_ONCE(v->counter); 40 } 41 42 static inline void atomic_set(atomic_t *v, int i) 43 { 44 - v->counter = i; 45 } 46 47 static inline int atomic_add_return(int i, atomic_t *v) ··· 133 134 static inline long long atomic64_read(const atomic64_t *v) 135 { 136 - return ACCESS_ONCE(v->counter); 137 } 138 139 static inline void atomic64_set(atomic64_t *v, long long i) 140 { 141 - v->counter = i; 142 } 143 144 static inline long long atomic64_add_return(long long i, atomic64_t *v)
··· 36 37 static inline int atomic_read(const atomic_t *v) 38 { 39 + int c; 40 + 41 + asm volatile( 42 + " l %0,%1\n" 43 + : "=d" (c) : "Q" (v->counter)); 44 + return c; 45 } 46 47 static inline void atomic_set(atomic_t *v, int i) 48 { 49 + asm volatile( 50 + " st %1,%0\n" 51 + : "=Q" (v->counter) : "d" (i)); 52 } 53 54 static inline int atomic_add_return(int i, atomic_t *v) ··· 126 127 static inline long long atomic64_read(const atomic64_t *v) 128 { 129 + long long c; 130 + 131 + asm volatile( 132 + " lg %0,%1\n" 133 + : "=d" (c) : "Q" (v->counter)); 134 + return c; 135 } 136 137 static inline void atomic64_set(atomic64_t *v, long long i) 138 { 139 + asm volatile( 140 + " stg %1,%0\n" 141 + : "=Q" (v->counter) : "d" (i)); 142 } 143 144 static inline long long atomic64_add_return(long long i, atomic64_t *v)