mirror of
https://github.com/koverstreet/bcachefs-tools.git
synced 2025-02-23 00:00:02 +03:00
provide atomic64_try_cmpxchg() for 32bit
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
0f9b409aee
commit
4be409afea
@ -344,6 +344,7 @@ void atomic64_sub(s64, atomic64_t *);
|
|||||||
|
|
||||||
s64 atomic64_xchg(atomic64_t *, s64);
|
s64 atomic64_xchg(atomic64_t *, s64);
|
||||||
s64 atomic64_cmpxchg(atomic64_t *, s64, s64);
|
s64 atomic64_cmpxchg(atomic64_t *, s64, s64);
|
||||||
|
bool atomic64_try_cmpxchg(atomic64_t *, s64 *, s64);
|
||||||
|
|
||||||
#define atomic64_add_negative(a, v) (atomic64_add_return((a), (v)) < 0)
|
#define atomic64_add_negative(a, v) (atomic64_add_return((a), (v)) < 0)
|
||||||
#define atomic64_inc(v) atomic64_add(1LL, (v))
|
#define atomic64_inc(v) atomic64_add(1LL, (v))
|
||||||
|
@ -157,6 +157,21 @@ long long atomic64_cmpxchg(atomic64_t *v, long long o, long long n)
|
|||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool atomic64_try_cmpxchg(atomic64_t *v, s64 *o, s64 n)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
raw_spinlock_t *lock = lock_addr(v);
|
||||||
|
|
||||||
|
raw_spin_lock_irqsave(lock, flags);
|
||||||
|
bool ret = v->counter == *o;
|
||||||
|
if (ret)
|
||||||
|
v->counter = n;
|
||||||
|
else
|
||||||
|
*o = v->counter;
|
||||||
|
raw_spin_unlock_irqrestore(lock, flags);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
long long atomic64_xchg(atomic64_t *v, long long new)
|
long long atomic64_xchg(atomic64_t *v, long long new)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
Loading…
Reference in New Issue
Block a user