diff options
author | Andrey Konovalov <andreyknvl@google.com> | 2015-08-02 11:11:04 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2015-08-03 04:59:30 -0400 |
commit | 76695af20c015206cffb84b15912be6797d0cca2 (patch) | |
tree | 9b11a22a998d19422b137cde196866efea49657c | |
parent | 75d2270280686bff21b9ba66c7f3dd379c887981 (diff) |
locking, arch: use WRITE_ONCE()/READ_ONCE() in smp_store_release()/smp_load_acquire()
Replace ACCESS_ONCE() macro in smp_store_release() and smp_load_acquire()
with WRITE_ONCE() and READ_ONCE() on x86, arm, arm64, ia64, metag, mips,
powerpc, s390, sparc and asm-generic since ACCESS_ONCE() does not work
reliably on non-scalar types.
WRITE_ONCE() and READ_ONCE() were introduced in the following commits:
230fa253df63 ("kernel: Provide READ_ONCE and ASSIGN_ONCE")
43239cbe79fc ("kernel: Change ASSIGN_ONCE(val, x) to WRITE_ONCE(x, val)")
Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Davidlohr Bueso <dbueso@suse.de>
Acked-by: Michael Ellerman <mpe@ellerman.id.au> (powerpc)
Acked-by: Ralf Baechle <ralf@linux-mips.org>
Cc: Alexander Duyck <alexander.h.duyck@redhat.com>
Cc: Andre Przywara <andre.przywara@arm.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Borislav Petkov <bp@suse.de>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Christian Borntraeger <borntraeger@de.ibm.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: James Hogan <james.hogan@imgtec.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: linux-arch@vger.kernel.org
Link: http://lkml.kernel.org/r/1438528264-714-1-git-send-email-andreyknvl@google.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | arch/arm/include/asm/barrier.h | 4 | ||||
-rw-r--r-- | arch/arm64/include/asm/barrier.h | 4 | ||||
-rw-r--r-- | arch/ia64/include/asm/barrier.h | 4 | ||||
-rw-r--r-- | arch/metag/include/asm/barrier.h | 4 | ||||
-rw-r--r-- | arch/mips/include/asm/barrier.h | 4 | ||||
-rw-r--r-- | arch/powerpc/include/asm/barrier.h | 4 | ||||
-rw-r--r-- | arch/s390/include/asm/barrier.h | 4 | ||||
-rw-r--r-- | arch/sparc/include/asm/barrier_64.h | 4 | ||||
-rw-r--r-- | arch/x86/include/asm/barrier.h | 8 | ||||
-rw-r--r-- | include/asm-generic/barrier.h | 4 |
10 files changed, 22 insertions, 22 deletions
diff --git a/arch/arm/include/asm/barrier.h b/arch/arm/include/asm/barrier.h index 6c2327e1c732..70393574e0fa 100644 --- a/arch/arm/include/asm/barrier.h +++ b/arch/arm/include/asm/barrier.h | |||
@@ -67,12 +67,12 @@ | |||
67 | do { \ | 67 | do { \ |
68 | compiletime_assert_atomic_type(*p); \ | 68 | compiletime_assert_atomic_type(*p); \ |
69 | smp_mb(); \ | 69 | smp_mb(); \ |
70 | ACCESS_ONCE(*p) = (v); \ | 70 | WRITE_ONCE(*p, v); \ |
71 | } while (0) | 71 | } while (0) |
72 | 72 | ||
73 | #define smp_load_acquire(p) \ | 73 | #define smp_load_acquire(p) \ |
74 | ({ \ | 74 | ({ \ |
75 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | 75 | typeof(*p) ___p1 = READ_ONCE(*p); \ |
76 | compiletime_assert_atomic_type(*p); \ | 76 | compiletime_assert_atomic_type(*p); \ |
77 | smp_mb(); \ | 77 | smp_mb(); \ |
78 | ___p1; \ | 78 | ___p1; \ |
diff --git a/arch/arm64/include/asm/barrier.h b/arch/arm64/include/asm/barrier.h index 0fa47c4275cb..ef93b20bc964 100644 --- a/arch/arm64/include/asm/barrier.h +++ b/arch/arm64/include/asm/barrier.h | |||
@@ -44,12 +44,12 @@ | |||
44 | do { \ | 44 | do { \ |
45 | compiletime_assert_atomic_type(*p); \ | 45 | compiletime_assert_atomic_type(*p); \ |
46 | barrier(); \ | 46 | barrier(); \ |
47 | ACCESS_ONCE(*p) = (v); \ | 47 | WRITE_ONCE(*p, v); \ |
48 | } while (0) | 48 | } while (0) |
49 | 49 | ||
50 | #define smp_load_acquire(p) \ | 50 | #define smp_load_acquire(p) \ |
51 | ({ \ | 51 | ({ \ |
52 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | 52 | typeof(*p) ___p1 = READ_ONCE(*p); \ |
53 | compiletime_assert_atomic_type(*p); \ | 53 | compiletime_assert_atomic_type(*p); \ |
54 | barrier(); \ | 54 | barrier(); \ |
55 | ___p1; \ | 55 | ___p1; \ |
diff --git a/arch/ia64/include/asm/barrier.h b/arch/ia64/include/asm/barrier.h index 843ba435e43b..df896a1c41d3 100644 --- a/arch/ia64/include/asm/barrier.h +++ b/arch/ia64/include/asm/barrier.h | |||
@@ -66,12 +66,12 @@ | |||
66 | do { \ | 66 | do { \ |
67 | compiletime_assert_atomic_type(*p); \ | 67 | compiletime_assert_atomic_type(*p); \ |
68 | barrier(); \ | 68 | barrier(); \ |
69 | ACCESS_ONCE(*p) = (v); \ | 69 | WRITE_ONCE(*p, v); \ |
70 | } while (0) | 70 | } while (0) |
71 | 71 | ||
72 | #define smp_load_acquire(p) \ | 72 | #define smp_load_acquire(p) \ |
73 | ({ \ | 73 | ({ \ |
74 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | 74 | typeof(*p) ___p1 = READ_ONCE(*p); \ |
75 | compiletime_assert_atomic_type(*p); \ | 75 | compiletime_assert_atomic_type(*p); \ |
76 | barrier(); \ | 76 | barrier(); \ |
77 | ___p1; \ | 77 | ___p1; \ |
diff --git a/arch/metag/include/asm/barrier.h b/arch/metag/include/asm/barrier.h index 5a696e507930..172b7e5efc53 100644 --- a/arch/metag/include/asm/barrier.h +++ b/arch/metag/include/asm/barrier.h | |||
@@ -90,12 +90,12 @@ static inline void fence(void) | |||
90 | do { \ | 90 | do { \ |
91 | compiletime_assert_atomic_type(*p); \ | 91 | compiletime_assert_atomic_type(*p); \ |
92 | smp_mb(); \ | 92 | smp_mb(); \ |
93 | ACCESS_ONCE(*p) = (v); \ | 93 | WRITE_ONCE(*p, v); \ |
94 | } while (0) | 94 | } while (0) |
95 | 95 | ||
96 | #define smp_load_acquire(p) \ | 96 | #define smp_load_acquire(p) \ |
97 | ({ \ | 97 | ({ \ |
98 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | 98 | typeof(*p) ___p1 = READ_ONCE(*p); \ |
99 | compiletime_assert_atomic_type(*p); \ | 99 | compiletime_assert_atomic_type(*p); \ |
100 | smp_mb(); \ | 100 | smp_mb(); \ |
101 | ___p1; \ | 101 | ___p1; \ |
diff --git a/arch/mips/include/asm/barrier.h b/arch/mips/include/asm/barrier.h index 7ecba84656d4..752e0b86c171 100644 --- a/arch/mips/include/asm/barrier.h +++ b/arch/mips/include/asm/barrier.h | |||
@@ -133,12 +133,12 @@ | |||
133 | do { \ | 133 | do { \ |
134 | compiletime_assert_atomic_type(*p); \ | 134 | compiletime_assert_atomic_type(*p); \ |
135 | smp_mb(); \ | 135 | smp_mb(); \ |
136 | ACCESS_ONCE(*p) = (v); \ | 136 | WRITE_ONCE(*p, v); \ |
137 | } while (0) | 137 | } while (0) |
138 | 138 | ||
139 | #define smp_load_acquire(p) \ | 139 | #define smp_load_acquire(p) \ |
140 | ({ \ | 140 | ({ \ |
141 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | 141 | typeof(*p) ___p1 = READ_ONCE(*p); \ |
142 | compiletime_assert_atomic_type(*p); \ | 142 | compiletime_assert_atomic_type(*p); \ |
143 | smp_mb(); \ | 143 | smp_mb(); \ |
144 | ___p1; \ | 144 | ___p1; \ |
diff --git a/arch/powerpc/include/asm/barrier.h b/arch/powerpc/include/asm/barrier.h index 51ccc7232042..0eca6efc0631 100644 --- a/arch/powerpc/include/asm/barrier.h +++ b/arch/powerpc/include/asm/barrier.h | |||
@@ -76,12 +76,12 @@ | |||
76 | do { \ | 76 | do { \ |
77 | compiletime_assert_atomic_type(*p); \ | 77 | compiletime_assert_atomic_type(*p); \ |
78 | smp_lwsync(); \ | 78 | smp_lwsync(); \ |
79 | ACCESS_ONCE(*p) = (v); \ | 79 | WRITE_ONCE(*p, v); \ |
80 | } while (0) | 80 | } while (0) |
81 | 81 | ||
82 | #define smp_load_acquire(p) \ | 82 | #define smp_load_acquire(p) \ |
83 | ({ \ | 83 | ({ \ |
84 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | 84 | typeof(*p) ___p1 = READ_ONCE(*p); \ |
85 | compiletime_assert_atomic_type(*p); \ | 85 | compiletime_assert_atomic_type(*p); \ |
86 | smp_lwsync(); \ | 86 | smp_lwsync(); \ |
87 | ___p1; \ | 87 | ___p1; \ |
diff --git a/arch/s390/include/asm/barrier.h b/arch/s390/include/asm/barrier.h index e6f8615a11eb..d48fe0162331 100644 --- a/arch/s390/include/asm/barrier.h +++ b/arch/s390/include/asm/barrier.h | |||
@@ -42,12 +42,12 @@ | |||
42 | do { \ | 42 | do { \ |
43 | compiletime_assert_atomic_type(*p); \ | 43 | compiletime_assert_atomic_type(*p); \ |
44 | barrier(); \ | 44 | barrier(); \ |
45 | ACCESS_ONCE(*p) = (v); \ | 45 | WRITE_ONCE(*p, v); \ |
46 | } while (0) | 46 | } while (0) |
47 | 47 | ||
48 | #define smp_load_acquire(p) \ | 48 | #define smp_load_acquire(p) \ |
49 | ({ \ | 49 | ({ \ |
50 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | 50 | typeof(*p) ___p1 = READ_ONCE(*p); \ |
51 | compiletime_assert_atomic_type(*p); \ | 51 | compiletime_assert_atomic_type(*p); \ |
52 | barrier(); \ | 52 | barrier(); \ |
53 | ___p1; \ | 53 | ___p1; \ |
diff --git a/arch/sparc/include/asm/barrier_64.h b/arch/sparc/include/asm/barrier_64.h index 809941e33e12..14a928601657 100644 --- a/arch/sparc/include/asm/barrier_64.h +++ b/arch/sparc/include/asm/barrier_64.h | |||
@@ -60,12 +60,12 @@ do { __asm__ __volatile__("ba,pt %%xcc, 1f\n\t" \ | |||
60 | do { \ | 60 | do { \ |
61 | compiletime_assert_atomic_type(*p); \ | 61 | compiletime_assert_atomic_type(*p); \ |
62 | barrier(); \ | 62 | barrier(); \ |
63 | ACCESS_ONCE(*p) = (v); \ | 63 | WRITE_ONCE(*p, v); \ |
64 | } while (0) | 64 | } while (0) |
65 | 65 | ||
66 | #define smp_load_acquire(p) \ | 66 | #define smp_load_acquire(p) \ |
67 | ({ \ | 67 | ({ \ |
68 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | 68 | typeof(*p) ___p1 = READ_ONCE(*p); \ |
69 | compiletime_assert_atomic_type(*p); \ | 69 | compiletime_assert_atomic_type(*p); \ |
70 | barrier(); \ | 70 | barrier(); \ |
71 | ___p1; \ | 71 | ___p1; \ |
diff --git a/arch/x86/include/asm/barrier.h b/arch/x86/include/asm/barrier.h index e51a8f803f55..d2bcfbed11c3 100644 --- a/arch/x86/include/asm/barrier.h +++ b/arch/x86/include/asm/barrier.h | |||
@@ -57,12 +57,12 @@ | |||
57 | do { \ | 57 | do { \ |
58 | compiletime_assert_atomic_type(*p); \ | 58 | compiletime_assert_atomic_type(*p); \ |
59 | smp_mb(); \ | 59 | smp_mb(); \ |
60 | ACCESS_ONCE(*p) = (v); \ | 60 | WRITE_ONCE(*p, v); \ |
61 | } while (0) | 61 | } while (0) |
62 | 62 | ||
63 | #define smp_load_acquire(p) \ | 63 | #define smp_load_acquire(p) \ |
64 | ({ \ | 64 | ({ \ |
65 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | 65 | typeof(*p) ___p1 = READ_ONCE(*p); \ |
66 | compiletime_assert_atomic_type(*p); \ | 66 | compiletime_assert_atomic_type(*p); \ |
67 | smp_mb(); \ | 67 | smp_mb(); \ |
68 | ___p1; \ | 68 | ___p1; \ |
@@ -74,12 +74,12 @@ do { \ | |||
74 | do { \ | 74 | do { \ |
75 | compiletime_assert_atomic_type(*p); \ | 75 | compiletime_assert_atomic_type(*p); \ |
76 | barrier(); \ | 76 | barrier(); \ |
77 | ACCESS_ONCE(*p) = (v); \ | 77 | WRITE_ONCE(*p, v); \ |
78 | } while (0) | 78 | } while (0) |
79 | 79 | ||
80 | #define smp_load_acquire(p) \ | 80 | #define smp_load_acquire(p) \ |
81 | ({ \ | 81 | ({ \ |
82 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | 82 | typeof(*p) ___p1 = READ_ONCE(*p); \ |
83 | compiletime_assert_atomic_type(*p); \ | 83 | compiletime_assert_atomic_type(*p); \ |
84 | barrier(); \ | 84 | barrier(); \ |
85 | ___p1; \ | 85 | ___p1; \ |
diff --git a/include/asm-generic/barrier.h b/include/asm-generic/barrier.h index 55e3abc2d027..b42afada1280 100644 --- a/include/asm-generic/barrier.h +++ b/include/asm-generic/barrier.h | |||
@@ -108,12 +108,12 @@ | |||
108 | do { \ | 108 | do { \ |
109 | compiletime_assert_atomic_type(*p); \ | 109 | compiletime_assert_atomic_type(*p); \ |
110 | smp_mb(); \ | 110 | smp_mb(); \ |
111 | ACCESS_ONCE(*p) = (v); \ | 111 | WRITE_ONCE(*p, v); \ |
112 | } while (0) | 112 | } while (0) |
113 | 113 | ||
114 | #define smp_load_acquire(p) \ | 114 | #define smp_load_acquire(p) \ |
115 | ({ \ | 115 | ({ \ |
116 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | 116 | typeof(*p) ___p1 = READ_ONCE(*p); \ |
117 | compiletime_assert_atomic_type(*p); \ | 117 | compiletime_assert_atomic_type(*p); \ |
118 | smp_mb(); \ | 118 | smp_mb(); \ |
119 | ___p1; \ | 119 | ___p1; \ |