Skip to content

Commit d54e56f

Browse files
leitaoKAGA-KOKO
authored andcommitted
x86/nmi: Fix the inverse "in NMI handler" check
Commit 344da54 ("x86/nmi: Print reasons why backtrace NMIs are ignored") creates a super nice framework to diagnose NMIs. Every time nmi_exc() is called, it increments a per_cpu counter (nsp->idt_nmi_seq). At its exit, it also increments the same counter. By reading this counter it can be seen how many times that function was called (dividing by 2), and, if the function is still being executed, by checking the idt_nmi_seq's least significant bit. On the check side (nmi_backtrace_stall_check()), that variable is queried to check if the NMI is still being executed, but, there is a mistake in the bitwise operation. That code wants to check if the least significant bit of the idt_nmi_seq is set or not, but does the opposite, and checks for all the other bits, which will always be true after the first exc_nmi() executed successfully. This appends the misleading string to the dump "(CPU currently in NMI handler function)" Fix it by checking the least significant bit, and if it is set, append the string. Fixes: 344da54 ("x86/nmi: Print reasons why backtrace NMIs are ignored") Signed-off-by: Breno Leitao <leitao@debian.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Paul E. McKenney <paulmck@kernel.org> Cc: stable@vger.kernel.org Link: https://lore.kernel.org/r/20240207165237.1048837-1-leitao@debian.org
1 parent 7dd0a21 commit d54e56f

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

arch/x86/kernel/nmi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -639,7 +639,7 @@ void nmi_backtrace_stall_check(const struct cpumask *btp)
639639
msgp = nmi_check_stall_msg[idx];
640640
if (nsp->idt_ignored_snap != READ_ONCE(nsp->idt_ignored) && (idx & 0x1))
641641
modp = ", but OK because ignore_nmis was set";
642-
if (nmi_seq & ~0x1)
642+
if (nmi_seq & 0x1)
643643
msghp = " (CPU currently in NMI handler function)";
644644
else if (nsp->idt_nmi_seq_snap + 1 == nmi_seq)
645645
msghp = " (CPU exited one NMI handler function)";

0 commit comments

Comments
 (0)