On Mon, May 11, 2015 at 04:54:08PM +0200, Peter Zijlstra wrote:

> +++ b/arch/arm/include/asm/barrier.h
> @@ -81,7 +81,7 @@ do {                                                        
>                 \
>  #define read_barrier_depends()               do { } while(0)
>  #define smp_read_barrier_depends()   do { } while(0)
>  
> -#define set_mb(var, value)   do { var = value; smp_mb(); } while (0)
> +#define set_mb(var, value)   do { WRITE_ONCE(var, value); smp_mb(); } while 
> (0)
>  
>  #define smp_mb__before_atomic()      smp_mb()
>  #define smp_mb__after_atomic()       smp_mb()

Which triggered a massive compile fail and requires the same union
trickery we already had for READ_ONCE().

Added the below bit to the patch to aid compiling.

---
diff --git a/include/linux/compiler.h b/include/linux/compiler.h
index a7c0941d10da..03e227ba481c 100644
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -250,7 +250,7 @@ static __always_inline void __write_once_size(volatile void 
*p, void *res, int s
        ({ union { typeof(x) __val; char __c[1]; } __u; __read_once_size(&(x), 
__u.__c, sizeof(x)); __u.__val; })
 
 #define WRITE_ONCE(x, val) \
-       ({ typeof(x) __val = (val); __write_once_size(&(x), &__val, 
sizeof(__val)); __val; })
+       ({ union { typeof(x) __val; char __c[1]; } __u = { .__val = (val) }; 
__write_once_size(&(x), __u.__c, sizeof(x)); __u.__val; })
 
 #endif /* __KERNEL__ */
 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to