diff options
author | Peter Zijlstra <peterz@infradead.org> | 2015-05-12 04:52:27 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2015-05-19 02:31:59 -0400 |
commit | ab3f02fc237211f0583c1e7ba3bf504747be9b8d (patch) | |
tree | c859733055aed0ba98fcd4e6d3f160a86deb7d8c | |
parent | 6ce47fd961fa8fb206433789d7754c73cab3b5d0 (diff) |
locking/arch: Add WRITE_ONCE() to set_mb()
Since we assume set_mb() to result in a single store followed by a
full memory barrier, employ WRITE_ONCE().
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | arch/arm/include/asm/barrier.h | 2 | ||||
-rw-r--r-- | arch/arm64/include/asm/barrier.h | 2 | ||||
-rw-r--r-- | arch/ia64/include/asm/barrier.h | 2 | ||||
-rw-r--r-- | arch/metag/include/asm/barrier.h | 2 | ||||
-rw-r--r-- | arch/mips/include/asm/barrier.h | 2 | ||||
-rw-r--r-- | arch/powerpc/include/asm/barrier.h | 2 | ||||
-rw-r--r-- | arch/s390/include/asm/barrier.h | 2 | ||||
-rw-r--r-- | arch/sparc/include/asm/barrier_64.h | 2 | ||||
-rw-r--r-- | arch/x86/include/asm/barrier.h | 2 | ||||
-rw-r--r-- | arch/x86/um/asm/barrier.h | 2 | ||||
-rw-r--r-- | include/asm-generic/barrier.h | 2 | ||||
-rw-r--r-- | include/linux/compiler.h | 2 |
12 files changed, 12 insertions, 12 deletions
diff --git a/arch/arm/include/asm/barrier.h b/arch/arm/include/asm/barrier.h index d2f81e6b8c1c..993150aea681 100644 --- a/arch/arm/include/asm/barrier.h +++ b/arch/arm/include/asm/barrier.h | |||
@@ -81,7 +81,7 @@ do { \ | |||
81 | #define read_barrier_depends() do { } while(0) | 81 | #define read_barrier_depends() do { } while(0) |
82 | #define smp_read_barrier_depends() do { } while(0) | 82 | #define smp_read_barrier_depends() do { } while(0) |
83 | 83 | ||
84 | #define set_mb(var, value) do { var = value; smp_mb(); } while (0) | 84 | #define set_mb(var, value) do { WRITE_ONCE(var, value); smp_mb(); } while (0) |
85 | 85 | ||
86 | #define smp_mb__before_atomic() smp_mb() | 86 | #define smp_mb__before_atomic() smp_mb() |
87 | #define smp_mb__after_atomic() smp_mb() | 87 | #define smp_mb__after_atomic() smp_mb() |
diff --git a/arch/arm64/include/asm/barrier.h b/arch/arm64/include/asm/barrier.h index 71f19c4dc0de..ff7de78d01b8 100644 --- a/arch/arm64/include/asm/barrier.h +++ b/arch/arm64/include/asm/barrier.h | |||
@@ -114,7 +114,7 @@ do { \ | |||
114 | #define read_barrier_depends() do { } while(0) | 114 | #define read_barrier_depends() do { } while(0) |
115 | #define smp_read_barrier_depends() do { } while(0) | 115 | #define smp_read_barrier_depends() do { } while(0) |
116 | 116 | ||
117 | #define set_mb(var, value) do { var = value; smp_mb(); } while (0) | 117 | #define set_mb(var, value) do { WRITE_ONCE(var, value); smp_mb(); } while (0) |
118 | #define nop() asm volatile("nop"); | 118 | #define nop() asm volatile("nop"); |
119 | 119 | ||
120 | #define smp_mb__before_atomic() smp_mb() | 120 | #define smp_mb__before_atomic() smp_mb() |
diff --git a/arch/ia64/include/asm/barrier.h b/arch/ia64/include/asm/barrier.h index f6769eb2bbf9..03117e7b2ab8 100644 --- a/arch/ia64/include/asm/barrier.h +++ b/arch/ia64/include/asm/barrier.h | |||
@@ -82,7 +82,7 @@ do { \ | |||
82 | * acquire vs release semantics but we can't discuss this stuff with | 82 | * acquire vs release semantics but we can't discuss this stuff with |
83 | * Linus just yet. Grrr... | 83 | * Linus just yet. Grrr... |
84 | */ | 84 | */ |
85 | #define set_mb(var, value) do { (var) = (value); mb(); } while (0) | 85 | #define set_mb(var, value) do { WRITE_ONCE(var, value); mb(); } while (0) |
86 | 86 | ||
87 | /* | 87 | /* |
88 | * The group barrier in front of the rsm & ssm are necessary to ensure | 88 | * The group barrier in front of the rsm & ssm are necessary to ensure |
diff --git a/arch/metag/include/asm/barrier.h b/arch/metag/include/asm/barrier.h index d703d8e26a65..97eb018a2933 100644 --- a/arch/metag/include/asm/barrier.h +++ b/arch/metag/include/asm/barrier.h | |||
@@ -84,7 +84,7 @@ static inline void fence(void) | |||
84 | #define read_barrier_depends() do { } while (0) | 84 | #define read_barrier_depends() do { } while (0) |
85 | #define smp_read_barrier_depends() do { } while (0) | 85 | #define smp_read_barrier_depends() do { } while (0) |
86 | 86 | ||
87 | #define set_mb(var, value) do { var = value; smp_mb(); } while (0) | 87 | #define set_mb(var, value) do { WRITE_ONCE(var, value); smp_mb(); } while (0) |
88 | 88 | ||
89 | #define smp_store_release(p, v) \ | 89 | #define smp_store_release(p, v) \ |
90 | do { \ | 90 | do { \ |
diff --git a/arch/mips/include/asm/barrier.h b/arch/mips/include/asm/barrier.h index 2b8bbbcb9be0..cff1bbdaa74a 100644 --- a/arch/mips/include/asm/barrier.h +++ b/arch/mips/include/asm/barrier.h | |||
@@ -113,7 +113,7 @@ | |||
113 | #endif | 113 | #endif |
114 | 114 | ||
115 | #define set_mb(var, value) \ | 115 | #define set_mb(var, value) \ |
116 | do { var = value; smp_mb(); } while (0) | 116 | do { WRITE_ONCE(var, value); smp_mb(); } while (0) |
117 | 117 | ||
118 | #define smp_llsc_mb() __asm__ __volatile__(__WEAK_LLSC_MB : : :"memory") | 118 | #define smp_llsc_mb() __asm__ __volatile__(__WEAK_LLSC_MB : : :"memory") |
119 | 119 | ||
diff --git a/arch/powerpc/include/asm/barrier.h b/arch/powerpc/include/asm/barrier.h index a3bf5be111ff..2a072e48780d 100644 --- a/arch/powerpc/include/asm/barrier.h +++ b/arch/powerpc/include/asm/barrier.h | |||
@@ -34,7 +34,7 @@ | |||
34 | #define rmb() __asm__ __volatile__ ("sync" : : : "memory") | 34 | #define rmb() __asm__ __volatile__ ("sync" : : : "memory") |
35 | #define wmb() __asm__ __volatile__ ("sync" : : : "memory") | 35 | #define wmb() __asm__ __volatile__ ("sync" : : : "memory") |
36 | 36 | ||
37 | #define set_mb(var, value) do { var = value; mb(); } while (0) | 37 | #define set_mb(var, value) do { WRITE_ONCE(var, value); mb(); } while (0) |
38 | 38 | ||
39 | #ifdef __SUBARCH_HAS_LWSYNC | 39 | #ifdef __SUBARCH_HAS_LWSYNC |
40 | # define SMPWMB LWSYNC | 40 | # define SMPWMB LWSYNC |
diff --git a/arch/s390/include/asm/barrier.h b/arch/s390/include/asm/barrier.h index 8d724718ec21..b66cd53d35fc 100644 --- a/arch/s390/include/asm/barrier.h +++ b/arch/s390/include/asm/barrier.h | |||
@@ -36,7 +36,7 @@ | |||
36 | #define smp_mb__before_atomic() smp_mb() | 36 | #define smp_mb__before_atomic() smp_mb() |
37 | #define smp_mb__after_atomic() smp_mb() | 37 | #define smp_mb__after_atomic() smp_mb() |
38 | 38 | ||
39 | #define set_mb(var, value) do { var = value; mb(); } while (0) | 39 | #define set_mb(var, value) do { WRITE_ONCE(var, value); mb(); } while (0) |
40 | 40 | ||
41 | #define smp_store_release(p, v) \ | 41 | #define smp_store_release(p, v) \ |
42 | do { \ | 42 | do { \ |
diff --git a/arch/sparc/include/asm/barrier_64.h b/arch/sparc/include/asm/barrier_64.h index 76648941fea7..125fec7512f4 100644 --- a/arch/sparc/include/asm/barrier_64.h +++ b/arch/sparc/include/asm/barrier_64.h | |||
@@ -41,7 +41,7 @@ do { __asm__ __volatile__("ba,pt %%xcc, 1f\n\t" \ | |||
41 | #define dma_wmb() wmb() | 41 | #define dma_wmb() wmb() |
42 | 42 | ||
43 | #define set_mb(__var, __value) \ | 43 | #define set_mb(__var, __value) \ |
44 | do { __var = __value; membar_safe("#StoreLoad"); } while(0) | 44 | do { WRITE_ONCE(__var, __value); membar_safe("#StoreLoad"); } while(0) |
45 | 45 | ||
46 | #ifdef CONFIG_SMP | 46 | #ifdef CONFIG_SMP |
47 | #define smp_mb() mb() | 47 | #define smp_mb() mb() |
diff --git a/arch/x86/include/asm/barrier.h b/arch/x86/include/asm/barrier.h index 959e45b81fe2..9de5cde133a1 100644 --- a/arch/x86/include/asm/barrier.h +++ b/arch/x86/include/asm/barrier.h | |||
@@ -40,7 +40,7 @@ | |||
40 | #define smp_mb() barrier() | 40 | #define smp_mb() barrier() |
41 | #define smp_rmb() barrier() | 41 | #define smp_rmb() barrier() |
42 | #define smp_wmb() barrier() | 42 | #define smp_wmb() barrier() |
43 | #define set_mb(var, value) do { var = value; barrier(); } while (0) | 43 | #define set_mb(var, value) do { WRITE_ONCE(var, value); barrier(); } while (0) |
44 | #endif /* SMP */ | 44 | #endif /* SMP */ |
45 | 45 | ||
46 | #define read_barrier_depends() do { } while (0) | 46 | #define read_barrier_depends() do { } while (0) |
diff --git a/arch/x86/um/asm/barrier.h b/arch/x86/um/asm/barrier.h index 7e8a1a650435..cc0cb01f346d 100644 --- a/arch/x86/um/asm/barrier.h +++ b/arch/x86/um/asm/barrier.h | |||
@@ -39,7 +39,7 @@ | |||
39 | #define smp_mb() barrier() | 39 | #define smp_mb() barrier() |
40 | #define smp_rmb() barrier() | 40 | #define smp_rmb() barrier() |
41 | #define smp_wmb() barrier() | 41 | #define smp_wmb() barrier() |
42 | #define set_mb(var, value) do { var = value; barrier(); } while (0) | 42 | #define set_mb(var, value) do { WRITE_ONCE(var, value); barrier(); } while (0) |
43 | 43 | ||
44 | #define read_barrier_depends() do { } while (0) | 44 | #define read_barrier_depends() do { } while (0) |
45 | #define smp_read_barrier_depends() do { } while (0) | 45 | #define smp_read_barrier_depends() do { } while (0) |
diff --git a/include/asm-generic/barrier.h b/include/asm-generic/barrier.h index f5c40b0fadc2..3938716b44d7 100644 --- a/include/asm-generic/barrier.h +++ b/include/asm-generic/barrier.h | |||
@@ -67,7 +67,7 @@ | |||
67 | #endif | 67 | #endif |
68 | 68 | ||
69 | #ifndef set_mb | 69 | #ifndef set_mb |
70 | #define set_mb(var, value) do { (var) = (value); mb(); } while (0) | 70 | #define set_mb(var, value) do { WRITE_ONCE(var, value); mb(); } while (0) |
71 | #endif | 71 | #endif |
72 | 72 | ||
73 | #ifndef smp_mb__before_atomic | 73 | #ifndef smp_mb__before_atomic |
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 | |||
250 | ({ union { typeof(x) __val; char __c[1]; } __u; __read_once_size(&(x), __u.__c, sizeof(x)); __u.__val; }) | 250 | ({ union { typeof(x) __val; char __c[1]; } __u; __read_once_size(&(x), __u.__c, sizeof(x)); __u.__val; }) |
251 | 251 | ||
252 | #define WRITE_ONCE(x, val) \ | 252 | #define WRITE_ONCE(x, val) \ |
253 | ({ typeof(x) __val = (val); __write_once_size(&(x), &__val, sizeof(__val)); __val; }) | 253 | ({ union { typeof(x) __val; char __c[1]; } __u = { .__val = (val) }; __write_once_size(&(x), __u.__c, sizeof(x)); __u.__val; }) |
254 | 254 | ||
255 | #endif /* __KERNEL__ */ | 255 | #endif /* __KERNEL__ */ |
256 | 256 | ||