Use atomic_try_cmpxchg() instead of atomic_cmpxchg(*ptr, old, new) == old
in hv_nmi_unknown(). On x86 the CMPXCHG instruction returns success in
the ZF flag, so this change saves a compare after CMPXCHG. The generated
asm code improves from:

  3e:   65 8b 15 00 00 00 00    mov    %gs:0x0(%rip),%edx
  45:   b8 ff ff ff ff          mov    $0xffffffff,%eax
  4a:   f0 0f b1 15 00 00 00    lock cmpxchg %edx,0x0(%rip)
  51:   00
  52:   83 f8 ff                cmp    $0xffffffff,%eax
  55:   0f 95 c0                setne  %al

to:

  3e:   65 8b 15 00 00 00 00    mov    %gs:0x0(%rip),%edx
  45:   b8 ff ff ff ff          mov    $0xffffffff,%eax
  4a:   f0 0f b1 15 00 00 00    lock cmpxchg %edx,0x0(%rip)
  51:   00
  52:   0f 95 c0                setne  %al

No functional change intended.

Cc: "K. Y. Srinivasan" <[email protected]>
Cc: Haiyang Zhang <[email protected]>
Cc: Wei Liu <[email protected]>
Cc: Dexuan Cui <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Borislav Petkov <[email protected]>
Cc: Dave Hansen <[email protected]>
Cc: "H. Peter Anvin" <[email protected]>
Signed-off-by: Uros Bizjak <[email protected]>
---
 arch/x86/kernel/cpu/mshyperv.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
index e6bba12c759c..01fa06dd06b6 100644
--- a/arch/x86/kernel/cpu/mshyperv.c
+++ b/arch/x86/kernel/cpu/mshyperv.c
@@ -262,11 +262,14 @@ static uint32_t  __init ms_hyperv_platform(void)
 static int hv_nmi_unknown(unsigned int val, struct pt_regs *regs)
 {
        static atomic_t nmi_cpu = ATOMIC_INIT(-1);
+       unsigned int old_cpu, this_cpu;
 
        if (!unknown_nmi_panic)
                return NMI_DONE;
 
-       if (atomic_cmpxchg(&nmi_cpu, -1, raw_smp_processor_id()) != -1)
+       old_cpu = -1;
+       this_cpu = raw_smp_processor_id();
+       if (!atomic_try_cmpxchg(&nmi_cpu, &old_cpu, this_cpu))
                return NMI_HANDLED;
 
        return NMI_DONE;
-- 
2.41.0


Reply via email to