diff options
author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2013-09-11 08:28:47 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2013-10-24 11:16:46 -0400 |
commit | 86d51bc31fabd3782a99375b6848c5c667e72605 (patch) | |
tree | 781b7b812c8fd4a51dbcdc238e8b90c4b3a2cbb6 /arch/s390/include | |
parent | fcd05b50fca44be3f96f8a17c5cce778669c29e7 (diff) |
s390/atomic: implement atomic_sub_return() with atomic_add_return()
Get rid of the own atomic_sub_return() implementation. Otherwise we can't
make use of the interlocked-access facility 1 instructions for
atomic_sub_return(), since there is no "load and subtract" instruction
available.
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/include')
-rw-r--r-- | arch/s390/include/asm/atomic.h | 23 |
1 files changed, 2 insertions, 21 deletions
diff --git a/arch/s390/include/asm/atomic.h b/arch/s390/include/asm/atomic.h index c797832daa5f..fea2c8887da5 100644 --- a/arch/s390/include/asm/atomic.h +++ b/arch/s390/include/asm/atomic.h | |||
@@ -60,11 +60,7 @@ static inline int atomic_add_return(int i, atomic_t *v) | |||
60 | #define atomic_inc(_v) atomic_add_return(1, _v) | 60 | #define atomic_inc(_v) atomic_add_return(1, _v) |
61 | #define atomic_inc_return(_v) atomic_add_return(1, _v) | 61 | #define atomic_inc_return(_v) atomic_add_return(1, _v) |
62 | #define atomic_inc_and_test(_v) (atomic_add_return(1, _v) == 0) | 62 | #define atomic_inc_and_test(_v) (atomic_add_return(1, _v) == 0) |
63 | 63 | #define atomic_sub_return(_i, _v) atomic_add_return(-(int)(_i), _v) | |
64 | static inline int atomic_sub_return(int i, atomic_t *v) | ||
65 | { | ||
66 | return __CS_LOOP(v, i, "sr"); | ||
67 | } | ||
68 | #define atomic_sub(_i, _v) atomic_sub_return(_i, _v) | 64 | #define atomic_sub(_i, _v) atomic_sub_return(_i, _v) |
69 | #define atomic_sub_and_test(_i, _v) (atomic_sub_return(_i, _v) == 0) | 65 | #define atomic_sub_and_test(_i, _v) (atomic_sub_return(_i, _v) == 0) |
70 | #define atomic_dec(_v) atomic_sub_return(1, _v) | 66 | #define atomic_dec(_v) atomic_sub_return(1, _v) |
@@ -152,11 +148,6 @@ static inline long long atomic64_add_return(long long i, atomic64_t *v) | |||
152 | return __CSG_LOOP(v, i, "agr"); | 148 | return __CSG_LOOP(v, i, "agr"); |
153 | } | 149 | } |
154 | 150 | ||
155 | static inline long long atomic64_sub_return(long long i, atomic64_t *v) | ||
156 | { | ||
157 | return __CSG_LOOP(v, i, "sgr"); | ||
158 | } | ||
159 | |||
160 | static inline void atomic64_clear_mask(unsigned long mask, atomic64_t *v) | 151 | static inline void atomic64_clear_mask(unsigned long mask, atomic64_t *v) |
161 | { | 152 | { |
162 | __CSG_LOOP(v, ~mask, "ngr"); | 153 | __CSG_LOOP(v, ~mask, "ngr"); |
@@ -248,17 +239,6 @@ static inline long long atomic64_add_return(long long i, atomic64_t *v) | |||
248 | return new; | 239 | return new; |
249 | } | 240 | } |
250 | 241 | ||
251 | static inline long long atomic64_sub_return(long long i, atomic64_t *v) | ||
252 | { | ||
253 | long long old, new; | ||
254 | |||
255 | do { | ||
256 | old = atomic64_read(v); | ||
257 | new = old - i; | ||
258 | } while (atomic64_cmpxchg(v, old, new) != old); | ||
259 | return new; | ||
260 | } | ||
261 | |||
262 | static inline void atomic64_set_mask(unsigned long long mask, atomic64_t *v) | 242 | static inline void atomic64_set_mask(unsigned long long mask, atomic64_t *v) |
263 | { | 243 | { |
264 | long long old, new; | 244 | long long old, new; |
@@ -319,6 +299,7 @@ static inline long long atomic64_dec_if_positive(atomic64_t *v) | |||
319 | #define atomic64_inc(_v) atomic64_add_return(1, _v) | 299 | #define atomic64_inc(_v) atomic64_add_return(1, _v) |
320 | #define atomic64_inc_return(_v) atomic64_add_return(1, _v) | 300 | #define atomic64_inc_return(_v) atomic64_add_return(1, _v) |
321 | #define atomic64_inc_and_test(_v) (atomic64_add_return(1, _v) == 0) | 301 | #define atomic64_inc_and_test(_v) (atomic64_add_return(1, _v) == 0) |
302 | #define atomic64_sub_return(_i, _v) atomic64_add_return(-(long long)(_i), _v) | ||
322 | #define atomic64_sub(_i, _v) atomic64_sub_return(_i, _v) | 303 | #define atomic64_sub(_i, _v) atomic64_sub_return(_i, _v) |
323 | #define atomic64_sub_and_test(_i, _v) (atomic64_sub_return(_i, _v) == 0) | 304 | #define atomic64_sub_and_test(_i, _v) (atomic64_sub_return(_i, _v) == 0) |
324 | #define atomic64_dec(_v) atomic64_sub_return(1, _v) | 305 | #define atomic64_dec(_v) atomic64_sub_return(1, _v) |