| From b59167ac7bafd804c91e49ad53c6d33a7394d4c8 Mon Sep 17 00:00:00 2001 |
| From: Peter Zijlstra <peterz@infradead.org> |
| Date: Thu, 11 Oct 2018 12:38:27 +0200 |
| Subject: x86/percpu: Fix this_cpu_read() |
| |
| From: Peter Zijlstra <peterz@infradead.org> |
| |
| commit b59167ac7bafd804c91e49ad53c6d33a7394d4c8 upstream. |
| |
| 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 |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/include/asm/percpu.h | 8 ++++---- |
| 1 file changed, 4 insertions(+), 4 deletions(-) |
| |
| --- a/arch/x86/include/asm/percpu.h |
| +++ b/arch/x86/include/asm/percpu.h |
| @@ -185,22 +185,22 @@ do { \ |
| typeof(var) pfo_ret__; \ |
| switch (sizeof(var)) { \ |
| case 1: \ |
| - asm(op "b "__percpu_arg(1)",%0" \ |
| + asm volatile(op "b "__percpu_arg(1)",%0"\ |
| : "=q" (pfo_ret__) \ |
| : "m" (var)); \ |
| break; \ |
| case 2: \ |
| - asm(op "w "__percpu_arg(1)",%0" \ |
| + asm volatile(op "w "__percpu_arg(1)",%0"\ |
| : "=r" (pfo_ret__) \ |
| : "m" (var)); \ |
| break; \ |
| case 4: \ |
| - asm(op "l "__percpu_arg(1)",%0" \ |
| + asm volatile(op "l "__percpu_arg(1)",%0"\ |
| : "=r" (pfo_ret__) \ |
| : "m" (var)); \ |
| break; \ |
| case 8: \ |
| - asm(op "q "__percpu_arg(1)",%0" \ |
| + asm volatile(op "q "__percpu_arg(1)",%0"\ |
| : "=r" (pfo_ret__) \ |
| : "m" (var)); \ |
| break; \ |