aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Zijlstra <peterz@infradead.org>2018-10-11 06:38:27 -0400
committerThomas Gleixner <tglx@linutronix.de>2018-10-14 05:11:22 -0400
commitb59167ac7bafd804c91e49ad53c6d33a7394d4c8 (patch)
tree9d38b3f253a8c7d60b6717bfd867c456ce586966
parent4907c68abd3f60f650f98d5a69d4ec77c0bde44f (diff)
x86/percpu: Fix this_cpu_read()
Eric reported that a sequence count loop using this_cpu_read() got optimized out. This is wrong, this_cpu_read() must imply READ_ONCE() because the interface is IRQ-safe, therefore an interrupt can have changed the per-cpu value. Fixes: 7c3576d261ce ("[PATCH] i386: Convert PDA into the percpu section") Reported-by: Eric Dumazet <edumazet@google.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Eric Dumazet <edumazet@google.com> Cc: hpa@zytor.com Cc: eric.dumazet@gmail.com Cc: bp@alien8.de Cc: stable@vger.kernel.org Link: https://lkml.kernel.org/r/20181011104019.748208519@infradead.org
-rw-r--r--arch/x86/include/asm/percpu.h8
1 files changed, 4 insertions, 4 deletions
diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h
index e9202a0de8f0..1a19d11cfbbd 100644
--- a/arch/x86/include/asm/percpu.h
+++ b/arch/x86/include/asm/percpu.h
@@ -185,22 +185,22 @@ do { \
185 typeof(var) pfo_ret__; \ 185 typeof(var) pfo_ret__; \
186 switch (sizeof(var)) { \ 186 switch (sizeof(var)) { \
187 case 1: \ 187 case 1: \
188 asm(op "b "__percpu_arg(1)",%0" \ 188 asm volatile(op "b "__percpu_arg(1)",%0"\
189 : "=q" (pfo_ret__) \ 189 : "=q" (pfo_ret__) \
190 : "m" (var)); \ 190 : "m" (var)); \
191 break; \ 191 break; \
192 case 2: \ 192 case 2: \
193 asm(op "w "__percpu_arg(1)",%0" \ 193 asm volatile(op "w "__percpu_arg(1)",%0"\
194 : "=r" (pfo_ret__) \ 194 : "=r" (pfo_ret__) \
195 : "m" (var)); \ 195 : "m" (var)); \
196 break; \ 196 break; \
197 case 4: \ 197 case 4: \
198 asm(op "l "__percpu_arg(1)",%0" \ 198 asm volatile(op "l "__percpu_arg(1)",%0"\
199 : "=r" (pfo_ret__) \ 199 : "=r" (pfo_ret__) \
200 : "m" (var)); \ 200 : "m" (var)); \
201 break; \ 201 break; \
202 case 8: \ 202 case 8: \
203 asm(op "q "__percpu_arg(1)",%0" \ 203 asm volatile(op "q "__percpu_arg(1)",%0"\
204 : "=r" (pfo_ret__) \ 204 : "=r" (pfo_ret__) \
205 : "m" (var)); \ 205 : "m" (var)); \
206 break; \ 206 break; \