diff options
Diffstat (limited to 'include/asm-generic/barrier.h')
| -rw-r--r-- | include/asm-generic/barrier.h | 63 | 
1 files changed, 51 insertions, 12 deletions
diff --git a/include/asm-generic/barrier.h b/include/asm-generic/barrier.h index 639d7a4d033..1402fa85538 100644 --- a/include/asm-generic/barrier.h +++ b/include/asm-generic/barrier.h @@ -1,4 +1,5 @@ -/* Generic barrier definitions, based on MN10300 definitions. +/* + * Generic barrier definitions, originally based on MN10300 definitions.   *   * It should be possible to use these on really simple architectures,   * but it serves more as a starting point for new ports. @@ -16,35 +17,73 @@  #ifndef __ASSEMBLY__ -#define nop() asm volatile ("nop") +#include <linux/compiler.h> + +#ifndef nop +#define nop()	asm volatile ("nop") +#endif  /* - * Force strict CPU ordering. - * And yes, this is required on UP too when we're talking - * to devices. + * Force strict CPU ordering. And yes, this is required on UP too when we're + * talking to devices.   * - * This implementation only contains a compiler barrier. + * Fall back to compiler barriers if nothing better is provided.   */ -#define mb()	asm volatile ("": : :"memory") +#ifndef mb +#define mb()	barrier() +#endif + +#ifndef rmb  #define rmb()	mb() -#define wmb()	asm volatile ("": : :"memory") +#endif + +#ifndef wmb +#define wmb()	mb() +#endif + +#ifndef read_barrier_depends +#define read_barrier_depends()		do { } while (0) +#endif  #ifdef CONFIG_SMP  #define smp_mb()	mb()  #define smp_rmb()	rmb()  #define smp_wmb()	wmb() +#define smp_read_barrier_depends()	read_barrier_depends()  #else  #define smp_mb()	barrier()  #define smp_rmb()	barrier()  #define smp_wmb()	barrier() +#define smp_read_barrier_depends()	do { } while (0) +#endif + +#ifndef set_mb +#define set_mb(var, value)  do { (var) = (value); mb(); } while (0) +#endif + +#ifndef smp_mb__before_atomic +#define smp_mb__before_atomic()	smp_mb() +#endif + +#ifndef smp_mb__after_atomic +#define smp_mb__after_atomic()	smp_mb()  #endif -#define set_mb(var, value)  do { var = value;  mb(); } while (0) -#define set_wmb(var, value) do { var = value; wmb(); } while (0) +#define smp_store_release(p, v)						\ +do {									\ +	compiletime_assert_atomic_type(*p);				\ +	smp_mb();							\ +	ACCESS_ONCE(*p) = (v);						\ +} while (0) -#define read_barrier_depends()		do {} while (0) -#define smp_read_barrier_depends()	do {} while (0) +#define smp_load_acquire(p)						\ +({									\ +	typeof(*p) ___p1 = ACCESS_ONCE(*p);				\ +	compiletime_assert_atomic_type(*p);				\ +	smp_mb();							\ +	___p1;								\ +})  #endif /* !__ASSEMBLY__ */  #endif /* __ASM_GENERIC_BARRIER_H */  | 
