diff options
Diffstat (limited to 'include/linux/atomic.h')
| -rw-r--r-- | include/linux/atomic.h | 747 | 
1 files changed, 590 insertions, 157 deletions
| diff --git a/include/linux/atomic.h b/include/linux/atomic.h index e451534fe54d..e71835bf60a9 100644 --- a/include/linux/atomic.h +++ b/include/linux/atomic.h @@ -163,206 +163,265 @@  #endif  #endif /* atomic_dec_return_relaxed */ -/* atomic_xchg_relaxed */ -#ifndef atomic_xchg_relaxed -#define  atomic_xchg_relaxed		atomic_xchg -#define  atomic_xchg_acquire		atomic_xchg -#define  atomic_xchg_release		atomic_xchg -#else /* atomic_xchg_relaxed */ +/* atomic_fetch_add_relaxed */ +#ifndef atomic_fetch_add_relaxed +#define atomic_fetch_add_relaxed	atomic_fetch_add +#define atomic_fetch_add_acquire	atomic_fetch_add +#define atomic_fetch_add_release	atomic_fetch_add -#ifndef atomic_xchg_acquire -#define  atomic_xchg_acquire(...)					\ -	__atomic_op_acquire(atomic_xchg, __VA_ARGS__) +#else /* atomic_fetch_add_relaxed */ + +#ifndef atomic_fetch_add_acquire +#define atomic_fetch_add_acquire(...)					\ +	__atomic_op_acquire(atomic_fetch_add, __VA_ARGS__)  #endif -#ifndef atomic_xchg_release -#define  atomic_xchg_release(...)					\ -	__atomic_op_release(atomic_xchg, __VA_ARGS__) +#ifndef atomic_fetch_add_release +#define atomic_fetch_add_release(...)					\ +	__atomic_op_release(atomic_fetch_add, __VA_ARGS__)  #endif -#ifndef atomic_xchg -#define  atomic_xchg(...)						\ -	__atomic_op_fence(atomic_xchg, __VA_ARGS__) +#ifndef atomic_fetch_add +#define atomic_fetch_add(...)						\ +	__atomic_op_fence(atomic_fetch_add, __VA_ARGS__) +#endif +#endif /* atomic_fetch_add_relaxed */ + +/* atomic_fetch_inc_relaxed */ +#ifndef atomic_fetch_inc_relaxed + +#ifndef atomic_fetch_inc +#define atomic_fetch_inc(v)	        atomic_fetch_add(1, (v)) +#define atomic_fetch_inc_relaxed(v)	atomic_fetch_add_relaxed(1, (v)) +#define atomic_fetch_inc_acquire(v)	atomic_fetch_add_acquire(1, (v)) +#define atomic_fetch_inc_release(v)	atomic_fetch_add_release(1, (v)) +#else /* atomic_fetch_inc */ +#define atomic_fetch_inc_relaxed	atomic_fetch_inc +#define atomic_fetch_inc_acquire	atomic_fetch_inc +#define atomic_fetch_inc_release	atomic_fetch_inc +#endif /* atomic_fetch_inc */ + +#else /* atomic_fetch_inc_relaxed */ + +#ifndef atomic_fetch_inc_acquire +#define atomic_fetch_inc_acquire(...)					\ +	__atomic_op_acquire(atomic_fetch_inc, __VA_ARGS__)  #endif -#endif /* atomic_xchg_relaxed */ -/* atomic_cmpxchg_relaxed */ -#ifndef atomic_cmpxchg_relaxed -#define  atomic_cmpxchg_relaxed		atomic_cmpxchg -#define  atomic_cmpxchg_acquire		atomic_cmpxchg -#define  atomic_cmpxchg_release		atomic_cmpxchg +#ifndef atomic_fetch_inc_release +#define atomic_fetch_inc_release(...)					\ +	__atomic_op_release(atomic_fetch_inc, __VA_ARGS__) +#endif -#else /* atomic_cmpxchg_relaxed */ +#ifndef atomic_fetch_inc +#define atomic_fetch_inc(...)						\ +	__atomic_op_fence(atomic_fetch_inc, __VA_ARGS__) +#endif +#endif /* atomic_fetch_inc_relaxed */ -#ifndef atomic_cmpxchg_acquire -#define  atomic_cmpxchg_acquire(...)					\ -	__atomic_op_acquire(atomic_cmpxchg, __VA_ARGS__) +/* atomic_fetch_sub_relaxed */ +#ifndef atomic_fetch_sub_relaxed +#define atomic_fetch_sub_relaxed	atomic_fetch_sub +#define atomic_fetch_sub_acquire	atomic_fetch_sub +#define atomic_fetch_sub_release	atomic_fetch_sub + +#else /* atomic_fetch_sub_relaxed */ + +#ifndef atomic_fetch_sub_acquire +#define atomic_fetch_sub_acquire(...)					\ +	__atomic_op_acquire(atomic_fetch_sub, __VA_ARGS__)  #endif -#ifndef atomic_cmpxchg_release -#define  atomic_cmpxchg_release(...)					\ -	__atomic_op_release(atomic_cmpxchg, __VA_ARGS__) +#ifndef atomic_fetch_sub_release +#define atomic_fetch_sub_release(...)					\ +	__atomic_op_release(atomic_fetch_sub, __VA_ARGS__)  #endif -#ifndef atomic_cmpxchg -#define  atomic_cmpxchg(...)						\ -	__atomic_op_fence(atomic_cmpxchg, __VA_ARGS__) +#ifndef atomic_fetch_sub +#define atomic_fetch_sub(...)						\ +	__atomic_op_fence(atomic_fetch_sub, __VA_ARGS__) +#endif +#endif /* atomic_fetch_sub_relaxed */ + +/* atomic_fetch_dec_relaxed */ +#ifndef atomic_fetch_dec_relaxed + +#ifndef atomic_fetch_dec +#define atomic_fetch_dec(v)	        atomic_fetch_sub(1, (v)) +#define atomic_fetch_dec_relaxed(v)	atomic_fetch_sub_relaxed(1, (v)) +#define atomic_fetch_dec_acquire(v)	atomic_fetch_sub_acquire(1, (v)) +#define atomic_fetch_dec_release(v)	atomic_fetch_sub_release(1, (v)) +#else /* atomic_fetch_dec */ +#define atomic_fetch_dec_relaxed	atomic_fetch_dec +#define atomic_fetch_dec_acquire	atomic_fetch_dec +#define atomic_fetch_dec_release	atomic_fetch_dec +#endif /* atomic_fetch_dec */ + +#else /* atomic_fetch_dec_relaxed */ + +#ifndef atomic_fetch_dec_acquire +#define atomic_fetch_dec_acquire(...)					\ +	__atomic_op_acquire(atomic_fetch_dec, __VA_ARGS__)  #endif -#endif /* atomic_cmpxchg_relaxed */ -#ifndef atomic64_read_acquire -#define  atomic64_read_acquire(v)	smp_load_acquire(&(v)->counter) +#ifndef atomic_fetch_dec_release +#define atomic_fetch_dec_release(...)					\ +	__atomic_op_release(atomic_fetch_dec, __VA_ARGS__)  #endif -#ifndef atomic64_set_release -#define  atomic64_set_release(v, i)	smp_store_release(&(v)->counter, (i)) +#ifndef atomic_fetch_dec +#define atomic_fetch_dec(...)						\ +	__atomic_op_fence(atomic_fetch_dec, __VA_ARGS__)  #endif +#endif /* atomic_fetch_dec_relaxed */ -/* atomic64_add_return_relaxed */ -#ifndef atomic64_add_return_relaxed -#define  atomic64_add_return_relaxed	atomic64_add_return -#define  atomic64_add_return_acquire	atomic64_add_return -#define  atomic64_add_return_release	atomic64_add_return +/* atomic_fetch_or_relaxed */ +#ifndef atomic_fetch_or_relaxed +#define atomic_fetch_or_relaxed	atomic_fetch_or +#define atomic_fetch_or_acquire	atomic_fetch_or +#define atomic_fetch_or_release	atomic_fetch_or -#else /* atomic64_add_return_relaxed */ +#else /* atomic_fetch_or_relaxed */ -#ifndef atomic64_add_return_acquire -#define  atomic64_add_return_acquire(...)				\ -	__atomic_op_acquire(atomic64_add_return, __VA_ARGS__) +#ifndef atomic_fetch_or_acquire +#define atomic_fetch_or_acquire(...)					\ +	__atomic_op_acquire(atomic_fetch_or, __VA_ARGS__)  #endif -#ifndef atomic64_add_return_release -#define  atomic64_add_return_release(...)				\ -	__atomic_op_release(atomic64_add_return, __VA_ARGS__) +#ifndef atomic_fetch_or_release +#define atomic_fetch_or_release(...)					\ +	__atomic_op_release(atomic_fetch_or, __VA_ARGS__)  #endif -#ifndef atomic64_add_return -#define  atomic64_add_return(...)					\ -	__atomic_op_fence(atomic64_add_return, __VA_ARGS__) +#ifndef atomic_fetch_or +#define atomic_fetch_or(...)						\ +	__atomic_op_fence(atomic_fetch_or, __VA_ARGS__)  #endif -#endif /* atomic64_add_return_relaxed */ +#endif /* atomic_fetch_or_relaxed */ -/* atomic64_inc_return_relaxed */ -#ifndef atomic64_inc_return_relaxed -#define  atomic64_inc_return_relaxed	atomic64_inc_return -#define  atomic64_inc_return_acquire	atomic64_inc_return -#define  atomic64_inc_return_release	atomic64_inc_return +/* atomic_fetch_and_relaxed */ +#ifndef atomic_fetch_and_relaxed +#define atomic_fetch_and_relaxed	atomic_fetch_and +#define atomic_fetch_and_acquire	atomic_fetch_and +#define atomic_fetch_and_release	atomic_fetch_and -#else /* atomic64_inc_return_relaxed */ +#else /* atomic_fetch_and_relaxed */ -#ifndef atomic64_inc_return_acquire -#define  atomic64_inc_return_acquire(...)				\ -	__atomic_op_acquire(atomic64_inc_return, __VA_ARGS__) +#ifndef atomic_fetch_and_acquire +#define atomic_fetch_and_acquire(...)					\ +	__atomic_op_acquire(atomic_fetch_and, __VA_ARGS__)  #endif -#ifndef atomic64_inc_return_release -#define  atomic64_inc_return_release(...)				\ -	__atomic_op_release(atomic64_inc_return, __VA_ARGS__) +#ifndef atomic_fetch_and_release +#define atomic_fetch_and_release(...)					\ +	__atomic_op_release(atomic_fetch_and, __VA_ARGS__)  #endif -#ifndef atomic64_inc_return -#define  atomic64_inc_return(...)					\ -	__atomic_op_fence(atomic64_inc_return, __VA_ARGS__) +#ifndef atomic_fetch_and +#define atomic_fetch_and(...)						\ +	__atomic_op_fence(atomic_fetch_and, __VA_ARGS__)  #endif -#endif /* atomic64_inc_return_relaxed */ - +#endif /* atomic_fetch_and_relaxed */ -/* atomic64_sub_return_relaxed */ -#ifndef atomic64_sub_return_relaxed -#define  atomic64_sub_return_relaxed	atomic64_sub_return -#define  atomic64_sub_return_acquire	atomic64_sub_return -#define  atomic64_sub_return_release	atomic64_sub_return +#ifdef atomic_andnot +/* atomic_fetch_andnot_relaxed */ +#ifndef atomic_fetch_andnot_relaxed +#define atomic_fetch_andnot_relaxed	atomic_fetch_andnot +#define atomic_fetch_andnot_acquire	atomic_fetch_andnot +#define atomic_fetch_andnot_release	atomic_fetch_andnot -#else /* atomic64_sub_return_relaxed */ +#else /* atomic_fetch_andnot_relaxed */ -#ifndef atomic64_sub_return_acquire -#define  atomic64_sub_return_acquire(...)				\ -	__atomic_op_acquire(atomic64_sub_return, __VA_ARGS__) +#ifndef atomic_fetch_andnot_acquire +#define atomic_fetch_andnot_acquire(...)					\ +	__atomic_op_acquire(atomic_fetch_andnot, __VA_ARGS__)  #endif -#ifndef atomic64_sub_return_release -#define  atomic64_sub_return_release(...)				\ -	__atomic_op_release(atomic64_sub_return, __VA_ARGS__) +#ifndef atomic_fetch_andnot_release +#define atomic_fetch_andnot_release(...)					\ +	__atomic_op_release(atomic_fetch_andnot, __VA_ARGS__)  #endif -#ifndef atomic64_sub_return -#define  atomic64_sub_return(...)					\ -	__atomic_op_fence(atomic64_sub_return, __VA_ARGS__) +#ifndef atomic_fetch_andnot +#define atomic_fetch_andnot(...)						\ +	__atomic_op_fence(atomic_fetch_andnot, __VA_ARGS__)  #endif -#endif /* atomic64_sub_return_relaxed */ +#endif /* atomic_fetch_andnot_relaxed */ +#endif /* atomic_andnot */ -/* atomic64_dec_return_relaxed */ -#ifndef atomic64_dec_return_relaxed -#define  atomic64_dec_return_relaxed	atomic64_dec_return -#define  atomic64_dec_return_acquire	atomic64_dec_return -#define  atomic64_dec_return_release	atomic64_dec_return +/* atomic_fetch_xor_relaxed */ +#ifndef atomic_fetch_xor_relaxed +#define atomic_fetch_xor_relaxed	atomic_fetch_xor +#define atomic_fetch_xor_acquire	atomic_fetch_xor +#define atomic_fetch_xor_release	atomic_fetch_xor -#else /* atomic64_dec_return_relaxed */ +#else /* atomic_fetch_xor_relaxed */ -#ifndef atomic64_dec_return_acquire -#define  atomic64_dec_return_acquire(...)				\ -	__atomic_op_acquire(atomic64_dec_return, __VA_ARGS__) +#ifndef atomic_fetch_xor_acquire +#define atomic_fetch_xor_acquire(...)					\ +	__atomic_op_acquire(atomic_fetch_xor, __VA_ARGS__)  #endif -#ifndef atomic64_dec_return_release -#define  atomic64_dec_return_release(...)				\ -	__atomic_op_release(atomic64_dec_return, __VA_ARGS__) +#ifndef atomic_fetch_xor_release +#define atomic_fetch_xor_release(...)					\ +	__atomic_op_release(atomic_fetch_xor, __VA_ARGS__)  #endif -#ifndef atomic64_dec_return -#define  atomic64_dec_return(...)					\ -	__atomic_op_fence(atomic64_dec_return, __VA_ARGS__) +#ifndef atomic_fetch_xor +#define atomic_fetch_xor(...)						\ +	__atomic_op_fence(atomic_fetch_xor, __VA_ARGS__)  #endif -#endif /* atomic64_dec_return_relaxed */ +#endif /* atomic_fetch_xor_relaxed */ -/* atomic64_xchg_relaxed */ -#ifndef atomic64_xchg_relaxed -#define  atomic64_xchg_relaxed		atomic64_xchg -#define  atomic64_xchg_acquire		atomic64_xchg -#define  atomic64_xchg_release		atomic64_xchg -#else /* atomic64_xchg_relaxed */ +/* atomic_xchg_relaxed */ +#ifndef atomic_xchg_relaxed +#define  atomic_xchg_relaxed		atomic_xchg +#define  atomic_xchg_acquire		atomic_xchg +#define  atomic_xchg_release		atomic_xchg -#ifndef atomic64_xchg_acquire -#define  atomic64_xchg_acquire(...)					\ -	__atomic_op_acquire(atomic64_xchg, __VA_ARGS__) +#else /* atomic_xchg_relaxed */ + +#ifndef atomic_xchg_acquire +#define  atomic_xchg_acquire(...)					\ +	__atomic_op_acquire(atomic_xchg, __VA_ARGS__)  #endif -#ifndef atomic64_xchg_release -#define  atomic64_xchg_release(...)					\ -	__atomic_op_release(atomic64_xchg, __VA_ARGS__) +#ifndef atomic_xchg_release +#define  atomic_xchg_release(...)					\ +	__atomic_op_release(atomic_xchg, __VA_ARGS__)  #endif -#ifndef atomic64_xchg -#define  atomic64_xchg(...)						\ -	__atomic_op_fence(atomic64_xchg, __VA_ARGS__) +#ifndef atomic_xchg +#define  atomic_xchg(...)						\ +	__atomic_op_fence(atomic_xchg, __VA_ARGS__)  #endif -#endif /* atomic64_xchg_relaxed */ +#endif /* atomic_xchg_relaxed */ -/* atomic64_cmpxchg_relaxed */ -#ifndef atomic64_cmpxchg_relaxed -#define  atomic64_cmpxchg_relaxed	atomic64_cmpxchg -#define  atomic64_cmpxchg_acquire	atomic64_cmpxchg -#define  atomic64_cmpxchg_release	atomic64_cmpxchg +/* atomic_cmpxchg_relaxed */ +#ifndef atomic_cmpxchg_relaxed +#define  atomic_cmpxchg_relaxed		atomic_cmpxchg +#define  atomic_cmpxchg_acquire		atomic_cmpxchg +#define  atomic_cmpxchg_release		atomic_cmpxchg -#else /* atomic64_cmpxchg_relaxed */ +#else /* atomic_cmpxchg_relaxed */ -#ifndef atomic64_cmpxchg_acquire -#define  atomic64_cmpxchg_acquire(...)					\ -	__atomic_op_acquire(atomic64_cmpxchg, __VA_ARGS__) +#ifndef atomic_cmpxchg_acquire +#define  atomic_cmpxchg_acquire(...)					\ +	__atomic_op_acquire(atomic_cmpxchg, __VA_ARGS__)  #endif -#ifndef atomic64_cmpxchg_release -#define  atomic64_cmpxchg_release(...)					\ -	__atomic_op_release(atomic64_cmpxchg, __VA_ARGS__) +#ifndef atomic_cmpxchg_release +#define  atomic_cmpxchg_release(...)					\ +	__atomic_op_release(atomic_cmpxchg, __VA_ARGS__)  #endif -#ifndef atomic64_cmpxchg -#define  atomic64_cmpxchg(...)						\ -	__atomic_op_fence(atomic64_cmpxchg, __VA_ARGS__) +#ifndef atomic_cmpxchg +#define  atomic_cmpxchg(...)						\ +	__atomic_op_fence(atomic_cmpxchg, __VA_ARGS__)  #endif -#endif /* atomic64_cmpxchg_relaxed */ +#endif /* atomic_cmpxchg_relaxed */  /* cmpxchg_relaxed */  #ifndef cmpxchg_relaxed @@ -463,18 +522,28 @@ static inline void atomic_andnot(int i, atomic_t *v)  {  	atomic_and(~i, v);  } -#endif -static inline __deprecated void atomic_clear_mask(unsigned int mask, atomic_t *v) +static inline int atomic_fetch_andnot(int i, atomic_t *v)  { -	atomic_andnot(mask, v); +	return atomic_fetch_and(~i, v);  } -static inline __deprecated void atomic_set_mask(unsigned int mask, atomic_t *v) +static inline int atomic_fetch_andnot_relaxed(int i, atomic_t *v)  { -	atomic_or(mask, v); +	return atomic_fetch_and_relaxed(~i, v);  } +static inline int atomic_fetch_andnot_acquire(int i, atomic_t *v) +{ +	return atomic_fetch_and_acquire(~i, v); +} + +static inline int atomic_fetch_andnot_release(int i, atomic_t *v) +{ +	return atomic_fetch_and_release(~i, v); +} +#endif +  /**   * atomic_inc_not_zero_hint - increment if not null   * @v: pointer of type atomic_t @@ -558,36 +627,400 @@ static inline int atomic_dec_if_positive(atomic_t *v)  }  #endif -/** - * atomic_fetch_or - perform *p |= mask and return old value of *p - * @mask: mask to OR on the atomic_t - * @p: pointer to atomic_t - */ -#ifndef atomic_fetch_or -static inline int atomic_fetch_or(int mask, atomic_t *p) -{ -	int old, val = atomic_read(p); +#ifdef CONFIG_GENERIC_ATOMIC64 +#include <asm-generic/atomic64.h> +#endif -	for (;;) { -		old = atomic_cmpxchg(p, val, val | mask); -		if (old == val) -			break; -		val = old; -	} +#ifndef atomic64_read_acquire +#define  atomic64_read_acquire(v)	smp_load_acquire(&(v)->counter) +#endif -	return old; -} +#ifndef atomic64_set_release +#define  atomic64_set_release(v, i)	smp_store_release(&(v)->counter, (i))  #endif -#ifdef CONFIG_GENERIC_ATOMIC64 -#include <asm-generic/atomic64.h> +/* atomic64_add_return_relaxed */ +#ifndef atomic64_add_return_relaxed +#define  atomic64_add_return_relaxed	atomic64_add_return +#define  atomic64_add_return_acquire	atomic64_add_return +#define  atomic64_add_return_release	atomic64_add_return + +#else /* atomic64_add_return_relaxed */ + +#ifndef atomic64_add_return_acquire +#define  atomic64_add_return_acquire(...)				\ +	__atomic_op_acquire(atomic64_add_return, __VA_ARGS__) +#endif + +#ifndef atomic64_add_return_release +#define  atomic64_add_return_release(...)				\ +	__atomic_op_release(atomic64_add_return, __VA_ARGS__) +#endif + +#ifndef atomic64_add_return +#define  atomic64_add_return(...)					\ +	__atomic_op_fence(atomic64_add_return, __VA_ARGS__) +#endif +#endif /* atomic64_add_return_relaxed */ + +/* atomic64_inc_return_relaxed */ +#ifndef atomic64_inc_return_relaxed +#define  atomic64_inc_return_relaxed	atomic64_inc_return +#define  atomic64_inc_return_acquire	atomic64_inc_return +#define  atomic64_inc_return_release	atomic64_inc_return + +#else /* atomic64_inc_return_relaxed */ + +#ifndef atomic64_inc_return_acquire +#define  atomic64_inc_return_acquire(...)				\ +	__atomic_op_acquire(atomic64_inc_return, __VA_ARGS__) +#endif + +#ifndef atomic64_inc_return_release +#define  atomic64_inc_return_release(...)				\ +	__atomic_op_release(atomic64_inc_return, __VA_ARGS__) +#endif + +#ifndef atomic64_inc_return +#define  atomic64_inc_return(...)					\ +	__atomic_op_fence(atomic64_inc_return, __VA_ARGS__) +#endif +#endif /* atomic64_inc_return_relaxed */ + + +/* atomic64_sub_return_relaxed */ +#ifndef atomic64_sub_return_relaxed +#define  atomic64_sub_return_relaxed	atomic64_sub_return +#define  atomic64_sub_return_acquire	atomic64_sub_return +#define  atomic64_sub_return_release	atomic64_sub_return + +#else /* atomic64_sub_return_relaxed */ + +#ifndef atomic64_sub_return_acquire +#define  atomic64_sub_return_acquire(...)				\ +	__atomic_op_acquire(atomic64_sub_return, __VA_ARGS__)  #endif +#ifndef atomic64_sub_return_release +#define  atomic64_sub_return_release(...)				\ +	__atomic_op_release(atomic64_sub_return, __VA_ARGS__) +#endif + +#ifndef atomic64_sub_return +#define  atomic64_sub_return(...)					\ +	__atomic_op_fence(atomic64_sub_return, __VA_ARGS__) +#endif +#endif /* atomic64_sub_return_relaxed */ + +/* atomic64_dec_return_relaxed */ +#ifndef atomic64_dec_return_relaxed +#define  atomic64_dec_return_relaxed	atomic64_dec_return +#define  atomic64_dec_return_acquire	atomic64_dec_return +#define  atomic64_dec_return_release	atomic64_dec_return + +#else /* atomic64_dec_return_relaxed */ + +#ifndef atomic64_dec_return_acquire +#define  atomic64_dec_return_acquire(...)				\ +	__atomic_op_acquire(atomic64_dec_return, __VA_ARGS__) +#endif + +#ifndef atomic64_dec_return_release +#define  atomic64_dec_return_release(...)				\ +	__atomic_op_release(atomic64_dec_return, __VA_ARGS__) +#endif + +#ifndef atomic64_dec_return +#define  atomic64_dec_return(...)					\ +	__atomic_op_fence(atomic64_dec_return, __VA_ARGS__) +#endif +#endif /* atomic64_dec_return_relaxed */ + + +/* atomic64_fetch_add_relaxed */ +#ifndef atomic64_fetch_add_relaxed +#define atomic64_fetch_add_relaxed	atomic64_fetch_add +#define atomic64_fetch_add_acquire	atomic64_fetch_add +#define atomic64_fetch_add_release	atomic64_fetch_add + +#else /* atomic64_fetch_add_relaxed */ + +#ifndef atomic64_fetch_add_acquire +#define atomic64_fetch_add_acquire(...)					\ +	__atomic_op_acquire(atomic64_fetch_add, __VA_ARGS__) +#endif + +#ifndef atomic64_fetch_add_release +#define atomic64_fetch_add_release(...)					\ +	__atomic_op_release(atomic64_fetch_add, __VA_ARGS__) +#endif + +#ifndef atomic64_fetch_add +#define atomic64_fetch_add(...)						\ +	__atomic_op_fence(atomic64_fetch_add, __VA_ARGS__) +#endif +#endif /* atomic64_fetch_add_relaxed */ + +/* atomic64_fetch_inc_relaxed */ +#ifndef atomic64_fetch_inc_relaxed + +#ifndef atomic64_fetch_inc +#define atomic64_fetch_inc(v)		atomic64_fetch_add(1, (v)) +#define atomic64_fetch_inc_relaxed(v)	atomic64_fetch_add_relaxed(1, (v)) +#define atomic64_fetch_inc_acquire(v)	atomic64_fetch_add_acquire(1, (v)) +#define atomic64_fetch_inc_release(v)	atomic64_fetch_add_release(1, (v)) +#else /* atomic64_fetch_inc */ +#define atomic64_fetch_inc_relaxed	atomic64_fetch_inc +#define atomic64_fetch_inc_acquire	atomic64_fetch_inc +#define atomic64_fetch_inc_release	atomic64_fetch_inc +#endif /* atomic64_fetch_inc */ + +#else /* atomic64_fetch_inc_relaxed */ + +#ifndef atomic64_fetch_inc_acquire +#define atomic64_fetch_inc_acquire(...)					\ +	__atomic_op_acquire(atomic64_fetch_inc, __VA_ARGS__) +#endif + +#ifndef atomic64_fetch_inc_release +#define atomic64_fetch_inc_release(...)					\ +	__atomic_op_release(atomic64_fetch_inc, __VA_ARGS__) +#endif + +#ifndef atomic64_fetch_inc +#define atomic64_fetch_inc(...)						\ +	__atomic_op_fence(atomic64_fetch_inc, __VA_ARGS__) +#endif +#endif /* atomic64_fetch_inc_relaxed */ + +/* atomic64_fetch_sub_relaxed */ +#ifndef atomic64_fetch_sub_relaxed +#define atomic64_fetch_sub_relaxed	atomic64_fetch_sub +#define atomic64_fetch_sub_acquire	atomic64_fetch_sub +#define atomic64_fetch_sub_release	atomic64_fetch_sub + +#else /* atomic64_fetch_sub_relaxed */ + +#ifndef atomic64_fetch_sub_acquire +#define atomic64_fetch_sub_acquire(...)					\ +	__atomic_op_acquire(atomic64_fetch_sub, __VA_ARGS__) +#endif + +#ifndef atomic64_fetch_sub_release +#define atomic64_fetch_sub_release(...)					\ +	__atomic_op_release(atomic64_fetch_sub, __VA_ARGS__) +#endif + +#ifndef atomic64_fetch_sub +#define atomic64_fetch_sub(...)						\ +	__atomic_op_fence(atomic64_fetch_sub, __VA_ARGS__) +#endif +#endif /* atomic64_fetch_sub_relaxed */ + +/* atomic64_fetch_dec_relaxed */ +#ifndef atomic64_fetch_dec_relaxed + +#ifndef atomic64_fetch_dec +#define atomic64_fetch_dec(v)		atomic64_fetch_sub(1, (v)) +#define atomic64_fetch_dec_relaxed(v)	atomic64_fetch_sub_relaxed(1, (v)) +#define atomic64_fetch_dec_acquire(v)	atomic64_fetch_sub_acquire(1, (v)) +#define atomic64_fetch_dec_release(v)	atomic64_fetch_sub_release(1, (v)) +#else /* atomic64_fetch_dec */ +#define atomic64_fetch_dec_relaxed	atomic64_fetch_dec +#define atomic64_fetch_dec_acquire	atomic64_fetch_dec +#define atomic64_fetch_dec_release	atomic64_fetch_dec +#endif /* atomic64_fetch_dec */ + +#else /* atomic64_fetch_dec_relaxed */ + +#ifndef atomic64_fetch_dec_acquire +#define atomic64_fetch_dec_acquire(...)					\ +	__atomic_op_acquire(atomic64_fetch_dec, __VA_ARGS__) +#endif + +#ifndef atomic64_fetch_dec_release +#define atomic64_fetch_dec_release(...)					\ +	__atomic_op_release(atomic64_fetch_dec, __VA_ARGS__) +#endif + +#ifndef atomic64_fetch_dec +#define atomic64_fetch_dec(...)						\ +	__atomic_op_fence(atomic64_fetch_dec, __VA_ARGS__) +#endif +#endif /* atomic64_fetch_dec_relaxed */ + +/* atomic64_fetch_or_relaxed */ +#ifndef atomic64_fetch_or_relaxed +#define atomic64_fetch_or_relaxed	atomic64_fetch_or +#define atomic64_fetch_or_acquire	atomic64_fetch_or +#define atomic64_fetch_or_release	atomic64_fetch_or + +#else /* atomic64_fetch_or_relaxed */ + +#ifndef atomic64_fetch_or_acquire +#define atomic64_fetch_or_acquire(...)					\ +	__atomic_op_acquire(atomic64_fetch_or, __VA_ARGS__) +#endif + +#ifndef atomic64_fetch_or_release +#define atomic64_fetch_or_release(...)					\ +	__atomic_op_release(atomic64_fetch_or, __VA_ARGS__) +#endif + +#ifndef atomic64_fetch_or +#define atomic64_fetch_or(...)						\ +	__atomic_op_fence(atomic64_fetch_or, __VA_ARGS__) +#endif +#endif /* atomic64_fetch_or_relaxed */ + +/* atomic64_fetch_and_relaxed */ +#ifndef atomic64_fetch_and_relaxed +#define atomic64_fetch_and_relaxed	atomic64_fetch_and +#define atomic64_fetch_and_acquire	atomic64_fetch_and +#define atomic64_fetch_and_release	atomic64_fetch_and + +#else /* atomic64_fetch_and_relaxed */ + +#ifndef atomic64_fetch_and_acquire +#define atomic64_fetch_and_acquire(...)					\ +	__atomic_op_acquire(atomic64_fetch_and, __VA_ARGS__) +#endif + +#ifndef atomic64_fetch_and_release +#define atomic64_fetch_and_release(...)					\ +	__atomic_op_release(atomic64_fetch_and, __VA_ARGS__) +#endif + +#ifndef atomic64_fetch_and +#define atomic64_fetch_and(...)						\ +	__atomic_op_fence(atomic64_fetch_and, __VA_ARGS__) +#endif +#endif /* atomic64_fetch_and_relaxed */ + +#ifdef atomic64_andnot +/* atomic64_fetch_andnot_relaxed */ +#ifndef atomic64_fetch_andnot_relaxed +#define atomic64_fetch_andnot_relaxed	atomic64_fetch_andnot +#define atomic64_fetch_andnot_acquire	atomic64_fetch_andnot +#define atomic64_fetch_andnot_release	atomic64_fetch_andnot + +#else /* atomic64_fetch_andnot_relaxed */ + +#ifndef atomic64_fetch_andnot_acquire +#define atomic64_fetch_andnot_acquire(...)					\ +	__atomic_op_acquire(atomic64_fetch_andnot, __VA_ARGS__) +#endif + +#ifndef atomic64_fetch_andnot_release +#define atomic64_fetch_andnot_release(...)					\ +	__atomic_op_release(atomic64_fetch_andnot, __VA_ARGS__) +#endif + +#ifndef atomic64_fetch_andnot +#define atomic64_fetch_andnot(...)						\ +	__atomic_op_fence(atomic64_fetch_andnot, __VA_ARGS__) +#endif +#endif /* atomic64_fetch_andnot_relaxed */ +#endif /* atomic64_andnot */ + +/* atomic64_fetch_xor_relaxed */ +#ifndef atomic64_fetch_xor_relaxed +#define atomic64_fetch_xor_relaxed	atomic64_fetch_xor +#define atomic64_fetch_xor_acquire	atomic64_fetch_xor +#define atomic64_fetch_xor_release	atomic64_fetch_xor + +#else /* atomic64_fetch_xor_relaxed */ + +#ifndef atomic64_fetch_xor_acquire +#define atomic64_fetch_xor_acquire(...)					\ +	__atomic_op_acquire(atomic64_fetch_xor, __VA_ARGS__) +#endif + +#ifndef atomic64_fetch_xor_release +#define atomic64_fetch_xor_release(...)					\ +	__atomic_op_release(atomic64_fetch_xor, __VA_ARGS__) +#endif + +#ifndef atomic64_fetch_xor +#define atomic64_fetch_xor(...)						\ +	__atomic_op_fence(atomic64_fetch_xor, __VA_ARGS__) +#endif +#endif /* atomic64_fetch_xor_relaxed */ + + +/* atomic64_xchg_relaxed */ +#ifndef atomic64_xchg_relaxed +#define  atomic64_xchg_relaxed		atomic64_xchg +#define  atomic64_xchg_acquire		atomic64_xchg +#define  atomic64_xchg_release		atomic64_xchg + +#else /* atomic64_xchg_relaxed */ + +#ifndef atomic64_xchg_acquire +#define  atomic64_xchg_acquire(...)					\ +	__atomic_op_acquire(atomic64_xchg, __VA_ARGS__) +#endif + +#ifndef atomic64_xchg_release +#define  atomic64_xchg_release(...)					\ +	__atomic_op_release(atomic64_xchg, __VA_ARGS__) +#endif + +#ifndef atomic64_xchg +#define  atomic64_xchg(...)						\ +	__atomic_op_fence(atomic64_xchg, __VA_ARGS__) +#endif +#endif /* atomic64_xchg_relaxed */ + +/* atomic64_cmpxchg_relaxed */ +#ifndef atomic64_cmpxchg_relaxed +#define  atomic64_cmpxchg_relaxed	atomic64_cmpxchg +#define  atomic64_cmpxchg_acquire	atomic64_cmpxchg +#define  atomic64_cmpxchg_release	atomic64_cmpxchg + +#else /* atomic64_cmpxchg_relaxed */ + +#ifndef atomic64_cmpxchg_acquire +#define  atomic64_cmpxchg_acquire(...)					\ +	__atomic_op_acquire(atomic64_cmpxchg, __VA_ARGS__) +#endif + +#ifndef atomic64_cmpxchg_release +#define  atomic64_cmpxchg_release(...)					\ +	__atomic_op_release(atomic64_cmpxchg, __VA_ARGS__) +#endif + +#ifndef atomic64_cmpxchg +#define  atomic64_cmpxchg(...)						\ +	__atomic_op_fence(atomic64_cmpxchg, __VA_ARGS__) +#endif +#endif /* atomic64_cmpxchg_relaxed */ +  #ifndef atomic64_andnot  static inline void atomic64_andnot(long long i, atomic64_t *v)  {  	atomic64_and(~i, v);  } + +static inline long long atomic64_fetch_andnot(long long i, atomic64_t *v) +{ +	return atomic64_fetch_and(~i, v); +} + +static inline long long atomic64_fetch_andnot_relaxed(long long i, atomic64_t *v) +{ +	return atomic64_fetch_and_relaxed(~i, v); +} + +static inline long long atomic64_fetch_andnot_acquire(long long i, atomic64_t *v) +{ +	return atomic64_fetch_and_acquire(~i, v); +} + +static inline long long atomic64_fetch_andnot_release(long long i, atomic64_t *v) +{ +	return atomic64_fetch_and_release(~i, v); +}  #endif  #include <asm-generic/atomic-long.h> |