x86, perfcounters: add atomic64_xchg()
Complete atomic64_t support on the 32-bit side by adding atomic64_xch(). Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> LKML-Reference: <20090406094518.445450972@chello.nl> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
6278af660f
commit
98c2aaf8be
|
@ -290,6 +290,28 @@ atomic64_cmpxchg(atomic64_t *ptr, unsigned long long old_val,
|
||||||
return cmpxchg8b(&ptr->counter, old_val, new_val);
|
return cmpxchg8b(&ptr->counter, old_val, new_val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* atomic64_xchg - xchg atomic64 variable
|
||||||
|
* @ptr: pointer to type atomic64_t
|
||||||
|
* @new_val: value to assign
|
||||||
|
* @old_val: old value that was there
|
||||||
|
*
|
||||||
|
* Atomically xchgs the value of @ptr to @new_val and returns
|
||||||
|
* the old value.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline unsigned long long
|
||||||
|
atomic64_xchg(atomic64_t *ptr, unsigned long long new_val)
|
||||||
|
{
|
||||||
|
unsigned long long old_val;
|
||||||
|
|
||||||
|
do {
|
||||||
|
old_val = atomic_read(ptr);
|
||||||
|
} while (atomic64_cmpxchg(ptr, old_val, new_val) != old_val);
|
||||||
|
|
||||||
|
return old_val;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* atomic64_set - set atomic64 variable
|
* atomic64_set - set atomic64 variable
|
||||||
* @ptr: pointer to type atomic64_t
|
* @ptr: pointer to type atomic64_t
|
||||||
|
@ -299,11 +321,7 @@ atomic64_cmpxchg(atomic64_t *ptr, unsigned long long old_val,
|
||||||
*/
|
*/
|
||||||
static inline void atomic64_set(atomic64_t *ptr, unsigned long long new_val)
|
static inline void atomic64_set(atomic64_t *ptr, unsigned long long new_val)
|
||||||
{
|
{
|
||||||
unsigned long long old_val;
|
atomic64_xchg(ptr, new_val);
|
||||||
|
|
||||||
do {
|
|
||||||
old_val = atomic_read(ptr);
|
|
||||||
} while (atomic64_cmpxchg(ptr, old_val, new_val) != old_val);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue