]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/percpu: Fix operand constraint modifier in __raw_cpu_write()
authorUros Bizjak <ubizjak@gmail.com>
Tue, 30 Apr 2024 09:17:24 +0000 (11:17 +0200)
committerIngo Molnar <mingo@kernel.org>
Sat, 18 May 2024 09:18:42 +0000 (11:18 +0200)
__raw_cpu_write() with !USE_X86_SEG_SUPPORT config uses read/write
operand constraint modifier "+" for its memory location. This signals
the compiler that the location is both read and written by the asm.
This is not true, because MOV insn only writes to the output.

Correct the modifier to "=" to inform the compiler that the memory
location is only written to. This also prevents the compiler from
value tracking the undefined value from the uninitialized memory.

Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Link: https://lore.kernel.org/r/20240430091833.196482-5-ubizjak@gmail.com
arch/x86/include/asm/percpu.h

index d20255138426f14ec3e54a54c4644fc8aaf404d7..c77393cd02731e9ee0979d0e93ca5b4d4c86aa3f 100644 (file)
@@ -178,7 +178,7 @@ do {                                                                        \
                (void)pto_tmp__;                                        \
        }                                                               \
        asm qual(__pcpu_op2_##size("mov", "%[val]", __percpu_arg([var])) \
-           : [var] "+m" (__my_cpu_var(_var))                           \
+           : [var] "=m" (__my_cpu_var(_var))                           \
            : [val] __pcpu_reg_imm_##size(pto_val__));                  \
 } while (0)