diff options
author | Peter Zijlstra <peterz@infradead.org> | 2018-10-11 06:38:27 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2018-10-14 05:11:22 -0400 |
commit | b59167ac7bafd804c91e49ad53c6d33a7394d4c8 (patch) | |
tree | 9d38b3f253a8c7d60b6717bfd867c456ce586966 | |
parent | 4907c68abd3f60f650f98d5a69d4ec77c0bde44f (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.h | 8 |
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; \ |