|
@@ -198,17 +198,12 @@ static inline long atomic64_xchg(atomic64_t *v, long new)
|
|
*/
|
|
*/
|
|
static inline bool atomic64_add_unless(atomic64_t *v, long a, long u)
|
|
static inline bool atomic64_add_unless(atomic64_t *v, long a, long u)
|
|
{
|
|
{
|
|
- long c, old;
|
|
|
|
- c = atomic64_read(v);
|
|
|
|
- for (;;) {
|
|
|
|
- if (unlikely(c == (u)))
|
|
|
|
- break;
|
|
|
|
- old = atomic64_cmpxchg((v), c, c + (a));
|
|
|
|
- if (likely(old == c))
|
|
|
|
- break;
|
|
|
|
- c = old;
|
|
|
|
- }
|
|
|
|
- return c != (u);
|
|
|
|
|
|
+ long c = atomic64_read(v);
|
|
|
|
+ do {
|
|
|
|
+ if (unlikely(c == u))
|
|
|
|
+ return false;
|
|
|
|
+ } while (!atomic64_try_cmpxchg(v, &c, c + a));
|
|
|
|
+ return true;
|
|
}
|
|
}
|
|
|
|
|
|
#define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)
|
|
#define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)
|
|
@@ -222,17 +217,12 @@ static inline bool atomic64_add_unless(atomic64_t *v, long a, long u)
|
|
*/
|
|
*/
|
|
static inline long atomic64_dec_if_positive(atomic64_t *v)
|
|
static inline long atomic64_dec_if_positive(atomic64_t *v)
|
|
{
|
|
{
|
|
- long c, old, dec;
|
|
|
|
- c = atomic64_read(v);
|
|
|
|
- for (;;) {
|
|
|
|
|
|
+ long dec, c = atomic64_read(v);
|
|
|
|
+ do {
|
|
dec = c - 1;
|
|
dec = c - 1;
|
|
if (unlikely(dec < 0))
|
|
if (unlikely(dec < 0))
|
|
break;
|
|
break;
|
|
- old = atomic64_cmpxchg((v), c, dec);
|
|
|
|
- if (likely(old == c))
|
|
|
|
- break;
|
|
|
|
- c = old;
|
|
|
|
- }
|
|
|
|
|
|
+ } while (!atomic64_try_cmpxchg(v, &c, dec));
|
|
return dec;
|
|
return dec;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -248,14 +238,10 @@ static inline void atomic64_##op(long i, atomic64_t *v) \
|
|
#define ATOMIC64_FETCH_OP(op, c_op) \
|
|
#define ATOMIC64_FETCH_OP(op, c_op) \
|
|
static inline long atomic64_fetch_##op(long i, atomic64_t *v) \
|
|
static inline long atomic64_fetch_##op(long i, atomic64_t *v) \
|
|
{ \
|
|
{ \
|
|
- long old, val = atomic64_read(v); \
|
|
|
|
- for (;;) { \
|
|
|
|
- old = atomic64_cmpxchg(v, val, val c_op i); \
|
|
|
|
- if (old == val) \
|
|
|
|
- break; \
|
|
|
|
- val = old; \
|
|
|
|
- } \
|
|
|
|
- return old; \
|
|
|
|
|
|
+ long val = atomic64_read(v); \
|
|
|
|
+ do { \
|
|
|
|
+ } while (!atomic64_try_cmpxchg(v, &val, val c_op i)); \
|
|
|
|
+ return val; \
|
|
}
|
|
}
|
|
|
|
|
|
#define ATOMIC64_OPS(op, c_op) \
|
|
#define ATOMIC64_OPS(op, c_op) \
|