diff options
Diffstat (limited to 'include/asm-m68knommu/atomic.h')
-rw-r--r-- | include/asm-m68knommu/atomic.h | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/include/asm-m68knommu/atomic.h b/include/asm-m68knommu/atomic.h index 6c4e4b63e454..d5632a305dae 100644 --- a/include/asm-m68knommu/atomic.h +++ b/include/asm-m68knommu/atomic.h | |||
@@ -1,7 +1,7 @@ | |||
1 | #ifndef __ARCH_M68KNOMMU_ATOMIC__ | 1 | #ifndef __ARCH_M68KNOMMU_ATOMIC__ |
2 | #define __ARCH_M68KNOMMU_ATOMIC__ | 2 | #define __ARCH_M68KNOMMU_ATOMIC__ |
3 | 3 | ||
4 | #include <asm/system.h> /* local_irq_XXX() */ | 4 | #include <asm/system.h> |
5 | 5 | ||
6 | /* | 6 | /* |
7 | * Atomic operations that C can't guarantee us. Useful for | 7 | * Atomic operations that C can't guarantee us. Useful for |
@@ -131,14 +131,21 @@ static inline int atomic_sub_return(int i, atomic_t * v) | |||
131 | #define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n))) | 131 | #define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n))) |
132 | #define atomic_xchg(v, new) (xchg(&((v)->counter), new)) | 132 | #define atomic_xchg(v, new) (xchg(&((v)->counter), new)) |
133 | 133 | ||
134 | #define atomic_add_unless(v, a, u) \ | 134 | static __inline__ int atomic_add_unless(atomic_t *v, int a, int u) |
135 | ({ \ | 135 | { |
136 | int c, old; \ | 136 | int c, old; |
137 | c = atomic_read(v); \ | 137 | c = atomic_read(v); |
138 | while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \ | 138 | for (;;) { |
139 | c = old; \ | 139 | if (unlikely(c == (u))) |
140 | c != (u); \ | 140 | break; |
141 | }) | 141 | old = atomic_cmpxchg((v), c, c + (a)); |
142 | if (likely(old == c)) | ||
143 | break; | ||
144 | c = old; | ||
145 | } | ||
146 | return c != (u); | ||
147 | } | ||
148 | |||
142 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) | 149 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) |
143 | 150 | ||
144 | #define atomic_dec_return(v) atomic_sub_return(1,(v)) | 151 | #define atomic_dec_return(v) atomic_sub_return(1,(v)) |