atomic: Collapse all atomic_{set,clear}_mask definitions
Move the now generic definitions of atomic_{set,clear}_mask() into linux/atomic.h to avoid endless and pointless repetition. Also, provide an atomic_andnot() wrapper for those few archs that can implement that. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
e6942b7de2
commit
de9e432cb5
@ -155,16 +155,6 @@ ATOMIC_OP(xor, ^=, xor)
|
|||||||
#undef ATOMIC_OP_RETURN
|
#undef ATOMIC_OP_RETURN
|
||||||
#undef ATOMIC_OP
|
#undef ATOMIC_OP
|
||||||
|
|
||||||
static inline __deprecated void atomic_clear_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_and(~mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __deprecated void atomic_set_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_or(mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* __atomic_add_unless - add unless the number is a given value
|
* __atomic_add_unless - add unless the number is a given value
|
||||||
* @v: pointer of type atomic_t
|
* @v: pointer of type atomic_t
|
||||||
|
@ -32,16 +32,6 @@ asmlinkage int __raw_atomic_test_asm(const volatile int *ptr, int value);
|
|||||||
#define atomic_and(i, v) (void)__raw_atomic_and_asm(&(v)->counter, i)
|
#define atomic_and(i, v) (void)__raw_atomic_and_asm(&(v)->counter, i)
|
||||||
#define atomic_xor(i, v) (void)__raw_atomic_xor_asm(&(v)->counter, i)
|
#define atomic_xor(i, v) (void)__raw_atomic_xor_asm(&(v)->counter, i)
|
||||||
|
|
||||||
static inline __deprecated void atomic_clear_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_and(~mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __deprecated void atomic_set_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_or(mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <asm-generic/atomic.h>
|
#include <asm-generic/atomic.h>
|
||||||
|
@ -198,14 +198,4 @@ ATOMIC_OP(xor)
|
|||||||
|
|
||||||
#undef ATOMIC_OP
|
#undef ATOMIC_OP
|
||||||
|
|
||||||
static inline __deprecated void atomic_clear_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_and(~mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __deprecated void atomic_set_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_or(mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _ASM_ATOMIC_H */
|
#endif /* _ASM_ATOMIC_H */
|
||||||
|
@ -89,14 +89,4 @@ static inline int __atomic_add_unless(atomic_t *v, int a, int u)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline __deprecated void atomic_clear_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_and(~mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __deprecated void atomic_set_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_or(mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* __ARCH_H8300_ATOMIC __ */
|
#endif /* __ARCH_H8300_ATOMIC __ */
|
||||||
|
@ -243,15 +243,4 @@ static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u)
|
|||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static __inline__ __deprecated void atomic_clear_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_and(~mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static __inline__ __deprecated void atomic_set_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_or(mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _ASM_M32R_ATOMIC_H */
|
#endif /* _ASM_M32R_ATOMIC_H */
|
||||||
|
@ -174,16 +174,6 @@ static inline int atomic_add_negative(int i, atomic_t *v)
|
|||||||
return c != 0;
|
return c != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline __deprecated void atomic_clear_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_and(~mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __deprecated void atomic_set_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_or(mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u)
|
static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u)
|
||||||
{
|
{
|
||||||
int c, old;
|
int c, old;
|
||||||
|
@ -82,16 +82,6 @@ ATOMIC_OP(xor)
|
|||||||
#undef ATOMIC_OP_RETURN
|
#undef ATOMIC_OP_RETURN
|
||||||
#undef ATOMIC_OP
|
#undef ATOMIC_OP
|
||||||
|
|
||||||
static inline __deprecated void atomic_clear_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_and(~mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __deprecated void atomic_set_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_or(mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
|
static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
|
||||||
{
|
{
|
||||||
int result, temp;
|
int result, temp;
|
||||||
|
@ -76,16 +76,6 @@ ATOMIC_OP(xor, ^=)
|
|||||||
#undef ATOMIC_OP_RETURN
|
#undef ATOMIC_OP_RETURN
|
||||||
#undef ATOMIC_OP
|
#undef ATOMIC_OP
|
||||||
|
|
||||||
static inline __deprecated void atomic_clear_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_and(~mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __deprecated void atomic_set_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_or(mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
|
static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -131,30 +131,6 @@ static inline void atomic_dec(atomic_t *v)
|
|||||||
#define atomic_xchg(ptr, v) (xchg(&(ptr)->counter, (v)))
|
#define atomic_xchg(ptr, v) (xchg(&(ptr)->counter, (v)))
|
||||||
#define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new)))
|
#define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new)))
|
||||||
|
|
||||||
/**
|
|
||||||
* atomic_clear_mask - Atomically clear bits in memory
|
|
||||||
* @mask: Mask of the bits to be cleared
|
|
||||||
* @v: pointer to word in memory
|
|
||||||
*
|
|
||||||
* Atomically clears the bits set in mask from the memory word specified.
|
|
||||||
*/
|
|
||||||
static inline __deprecated void atomic_clear_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_and(~mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* atomic_set_mask - Atomically set bits in memory
|
|
||||||
* @mask: Mask of the bits to be set
|
|
||||||
* @v: pointer to word in memory
|
|
||||||
*
|
|
||||||
* Atomically sets the bits set in mask from the memory word specified.
|
|
||||||
*/
|
|
||||||
static inline __deprecated void atomic_set_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_or(mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
#endif /* CONFIG_SMP */
|
#endif /* CONFIG_SMP */
|
||||||
#endif /* _ASM_ATOMIC_H */
|
#endif /* _ASM_ATOMIC_H */
|
||||||
|
@ -595,25 +595,6 @@ _GLOBAL(copy_page)
|
|||||||
li r11,4
|
li r11,4
|
||||||
b 2b
|
b 2b
|
||||||
|
|
||||||
/*
|
|
||||||
* void atomic_clear_mask(atomic_t mask, atomic_t *addr)
|
|
||||||
* void atomic_set_mask(atomic_t mask, atomic_t *addr);
|
|
||||||
*/
|
|
||||||
_GLOBAL(atomic_clear_mask)
|
|
||||||
10: lwarx r5,0,r4
|
|
||||||
andc r5,r5,r3
|
|
||||||
PPC405_ERR77(0,r4)
|
|
||||||
stwcx. r5,0,r4
|
|
||||||
bne- 10b
|
|
||||||
blr
|
|
||||||
_GLOBAL(atomic_set_mask)
|
|
||||||
10: lwarx r5,0,r4
|
|
||||||
or r5,r5,r3
|
|
||||||
PPC405_ERR77(0,r4)
|
|
||||||
stwcx. r5,0,r4
|
|
||||||
bne- 10b
|
|
||||||
blr
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Extended precision shifts.
|
* Extended precision shifts.
|
||||||
*
|
*
|
||||||
|
@ -132,16 +132,6 @@ ATOMIC_OP(xor, XOR)
|
|||||||
|
|
||||||
#undef ATOMIC_OP
|
#undef ATOMIC_OP
|
||||||
|
|
||||||
static inline __deprecated void atomic_clear_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_and(~mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __deprecated void atomic_set_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_or(mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
|
#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
|
||||||
|
|
||||||
static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
|
static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
|
||||||
|
@ -25,16 +25,6 @@
|
|||||||
#include <asm/atomic-irq.h>
|
#include <asm/atomic-irq.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline __deprecated void atomic_clear_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_and(~mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __deprecated void atomic_set_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_or(mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0)
|
#define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0)
|
||||||
#define atomic_dec_return(v) atomic_sub_return(1, (v))
|
#define atomic_dec_return(v) atomic_sub_return(1, (v))
|
||||||
#define atomic_inc_return(v) atomic_add_return(1, (v))
|
#define atomic_inc_return(v) atomic_add_return(1, (v))
|
||||||
|
@ -234,16 +234,6 @@ static __always_inline short int atomic_inc_short(short int *v)
|
|||||||
return *v;
|
return *v;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline __deprecated void atomic_clear_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_and(~mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __deprecated void atomic_set_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_or(mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
# include <asm/atomic64_32.h>
|
# include <asm/atomic64_32.h>
|
||||||
#else
|
#else
|
||||||
|
@ -153,16 +153,6 @@ ATOMIC_OP(xor)
|
|||||||
#undef ATOMIC_OP_RETURN
|
#undef ATOMIC_OP_RETURN
|
||||||
#undef ATOMIC_OP
|
#undef ATOMIC_OP
|
||||||
|
|
||||||
static inline __deprecated void atomic_set_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_or(mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __deprecated void atomic_clear_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_and(~mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* atomic_sub_and_test - subtract value from variable and test result
|
* atomic_sub_and_test - subtract value from variable and test result
|
||||||
* @i: integer value to subtract
|
* @i: integer value to subtract
|
||||||
|
@ -113,16 +113,6 @@ ATOMIC_OP(xor, ^)
|
|||||||
#undef ATOMIC_OP_RETURN
|
#undef ATOMIC_OP_RETURN
|
||||||
#undef ATOMIC_OP
|
#undef ATOMIC_OP
|
||||||
|
|
||||||
static inline __deprecated void atomic_clear_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_and(~mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __deprecated void atomic_set_mask(unsigned int mask, atomic_t *v)
|
|
||||||
{
|
|
||||||
atomic_or(mask, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Atomic operations that C can't guarantee us. Useful for
|
* Atomic operations that C can't guarantee us. Useful for
|
||||||
* resource counting etc..
|
* resource counting etc..
|
||||||
|
@ -28,6 +28,23 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u)
|
|||||||
#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
|
#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef atomic_andnot
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
atomic_andnot(mask, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline __deprecated void atomic_set_mask(unsigned int mask, atomic_t *v)
|
||||||
|
{
|
||||||
|
atomic_or(mask, v);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* atomic_inc_not_zero_hint - increment if not null
|
* atomic_inc_not_zero_hint - increment if not null
|
||||||
* @v: pointer of type atomic_t
|
* @v: pointer of type atomic_t
|
||||||
@ -115,4 +132,12 @@ static inline int atomic_dec_if_positive(atomic_t *v)
|
|||||||
#ifdef CONFIG_GENERIC_ATOMIC64
|
#ifdef CONFIG_GENERIC_ATOMIC64
|
||||||
#include <asm-generic/atomic64.h>
|
#include <asm-generic/atomic64.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef atomic64_andnot
|
||||||
|
static inline void atomic64_andnot(long long i, atomic64_t *v)
|
||||||
|
{
|
||||||
|
atomic64_and(~i, v);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _LINUX_ATOMIC_H */
|
#endif /* _LINUX_ATOMIC_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user