aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/include
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2013-09-11 08:28:47 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2013-10-24 11:16:46 -0400
commit86d51bc31fabd3782a99375b6848c5c667e72605 (patch)
tree781b7b812c8fd4a51dbcdc238e8b90c4b3a2cbb6 /arch/s390/include
parentfcd05b50fca44be3f96f8a17c5cce778669c29e7 (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.h23
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)
64static 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
155static inline long long atomic64_sub_return(long long i, atomic64_t *v)
156{
157 return __CSG_LOOP(v, i, "sgr");
158}
159
160static inline void atomic64_clear_mask(unsigned long mask, atomic64_t *v) 151static 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
251static 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
262static inline void atomic64_set_mask(unsigned long long mask, atomic64_t *v) 242static 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)