diff options
| author | Nick Piggin <nickpiggin@yahoo.com.au> | 2005-11-13 19:07:25 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-13 21:14:16 -0500 |
| commit | 8426e1f6af0fd7f44d040af7263750c5a52f3cc3 (patch) | |
| tree | 827bd2588c2b73d11cea6869de8ff42dba134375 /include/asm-xtensa | |
| parent | 4a6dae6d382e9edf3ff440b819e554ed706359bc (diff) | |
[PATCH] atomic: inc_not_zero
Introduce an atomic_inc_not_zero operation. Make this a special case of
atomic_add_unless because lockless pagecache actually wants
atomic_inc_not_negativeone due to its offset refcount.
Signed-off-by: Nick Piggin <npiggin@suse.de>
Cc: "Paul E. McKenney" <paulmck@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include/asm-xtensa')
| -rw-r--r-- | include/asm-xtensa/atomic.h | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/include/asm-xtensa/atomic.h b/include/asm-xtensa/atomic.h index cd40c5e75160..3670cc7695da 100644 --- a/include/asm-xtensa/atomic.h +++ b/include/asm-xtensa/atomic.h | |||
| @@ -225,6 +225,25 @@ static inline int atomic_sub_return(int i, atomic_t * v) | |||
| 225 | 225 | ||
| 226 | #define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n))) | 226 | #define atomic_cmpxchg(v, o, n) ((int)cmpxchg(&((v)->counter), (o), (n))) |
| 227 | 227 | ||
| 228 | /** | ||
| 229 | * atomic_add_unless - add unless the number is a given value | ||
| 230 | * @v: pointer of type atomic_t | ||
| 231 | * @a: the amount to add to v... | ||
| 232 | * @u: ...unless v is equal to u. | ||
| 233 | * | ||
| 234 | * Atomically adds @a to @v, so long as it was not @u. | ||
| 235 | * Returns non-zero if @v was not @u, and zero otherwise. | ||
| 236 | */ | ||
| 237 | #define atomic_add_unless(v, a, u) \ | ||
| 238 | ({ \ | ||
| 239 | int c, old; \ | ||
| 240 | c = atomic_read(v); \ | ||
| 241 | while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \ | ||
| 242 | c = old; \ | ||
| 243 | c != (u); \ | ||
| 244 | }) | ||
| 245 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) | ||
| 246 | |||
| 228 | static inline void atomic_clear_mask(unsigned int mask, atomic_t *v) | 247 | static inline void atomic_clear_mask(unsigned int mask, atomic_t *v) |
| 229 | { | 248 | { |
| 230 | unsigned int all_f = -1; | 249 | unsigned int all_f = -1; |
