diff options
author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2010-05-26 17:26:18 -0400 |
---|---|---|
committer | Martin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com> | 2010-05-26 17:26:29 -0400 |
commit | 2ddb3ec41495c2f4535d1e72e21e25870117f848 (patch) | |
tree | b8625f5b0b56ca212382cd3f7ea8b62e877061ec /arch/s390 | |
parent | 1ef6acf597559fd1c244190512144c40619299bf (diff) |
[S390] atomic: implement atomic64_dec_if_positive
Implement atomic64_dec_if_positive and add missing system.h header
include.
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390')
-rw-r--r-- | arch/s390/include/asm/atomic.h | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/arch/s390/include/asm/atomic.h b/arch/s390/include/asm/atomic.h index 451bfbb9db3d..76daea117181 100644 --- a/arch/s390/include/asm/atomic.h +++ b/arch/s390/include/asm/atomic.h | |||
@@ -15,6 +15,7 @@ | |||
15 | 15 | ||
16 | #include <linux/compiler.h> | 16 | #include <linux/compiler.h> |
17 | #include <linux/types.h> | 17 | #include <linux/types.h> |
18 | #include <asm/system.h> | ||
18 | 19 | ||
19 | #define ATOMIC_INIT(i) { (i) } | 20 | #define ATOMIC_INIT(i) { (i) } |
20 | 21 | ||
@@ -274,6 +275,7 @@ static inline void atomic64_clear_mask(unsigned long long mask, atomic64_t *v) | |||
274 | static inline int atomic64_add_unless(atomic64_t *v, long long a, long long u) | 275 | static inline int atomic64_add_unless(atomic64_t *v, long long a, long long u) |
275 | { | 276 | { |
276 | long long c, old; | 277 | long long c, old; |
278 | |||
277 | c = atomic64_read(v); | 279 | c = atomic64_read(v); |
278 | for (;;) { | 280 | for (;;) { |
279 | if (unlikely(c == u)) | 281 | if (unlikely(c == u)) |
@@ -286,6 +288,23 @@ static inline int atomic64_add_unless(atomic64_t *v, long long a, long long u) | |||
286 | return c != u; | 288 | return c != u; |
287 | } | 289 | } |
288 | 290 | ||
291 | static inline long long atomic64_dec_if_positive(atomic64_t *v) | ||
292 | { | ||
293 | long long c, old, dec; | ||
294 | |||
295 | c = atomic64_read(v); | ||
296 | for (;;) { | ||
297 | dec = c - 1; | ||
298 | if (unlikely(dec < 0)) | ||
299 | break; | ||
300 | old = atomic64_cmpxchg((v), c, dec); | ||
301 | if (likely(old == c)) | ||
302 | break; | ||
303 | c = old; | ||
304 | } | ||
305 | return dec; | ||
306 | } | ||
307 | |||
289 | #define atomic64_add(_i, _v) atomic64_add_return(_i, _v) | 308 | #define atomic64_add(_i, _v) atomic64_add_return(_i, _v) |
290 | #define atomic64_add_negative(_i, _v) (atomic64_add_return(_i, _v) < 0) | 309 | #define atomic64_add_negative(_i, _v) (atomic64_add_return(_i, _v) < 0) |
291 | #define atomic64_inc(_v) atomic64_add_return(1, _v) | 310 | #define atomic64_inc(_v) atomic64_add_return(1, _v) |