diff options
Diffstat (limited to 'include/asm-m32r/atomic.h')
-rw-r--r-- | include/asm-m32r/atomic.h | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/include/asm-m32r/atomic.h b/include/asm-m32r/atomic.h index f5a7d7301c72..3a38ffe4a4f4 100644 --- a/include/asm-m32r/atomic.h +++ b/include/asm-m32r/atomic.h | |||
@@ -253,14 +253,21 @@ static __inline__ int atomic_dec_return(atomic_t *v) | |||
253 | * Atomically adds @a to @v, so long as it was not @u. | 253 | * Atomically adds @a to @v, so long as it was not @u. |
254 | * Returns non-zero if @v was not @u, and zero otherwise. | 254 | * Returns non-zero if @v was not @u, and zero otherwise. |
255 | */ | 255 | */ |
256 | #define atomic_add_unless(v, a, u) \ | 256 | static __inline__ int atomic_add_unless(atomic_t *v, int a, int u) |
257 | ({ \ | 257 | { |
258 | int c, old; \ | 258 | int c, old; |
259 | c = atomic_read(v); \ | 259 | c = atomic_read(v); |
260 | while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \ | 260 | for (;;) { |
261 | c = old; \ | 261 | if (unlikely(c == (u))) |
262 | c != (u); \ | 262 | break; |
263 | }) | 263 | old = atomic_cmpxchg((v), c, c + (a)); |
264 | if (likely(old == c)) | ||
265 | break; | ||
266 | c = old; | ||
267 | } | ||
268 | return c != (u); | ||
269 | } | ||
270 | |||
264 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) | 271 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) |
265 | 272 | ||
266 | static __inline__ void atomic_clear_mask(unsigned long mask, atomic_t *addr) | 273 | static __inline__ void atomic_clear_mask(unsigned long mask, atomic_t *addr) |