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_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_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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
Loading…
Reference in New Issue
Block a user