When a unknown NMI happened the panic would claim a NMI watchdog timeout. Also it would check the variable set by nmi_watchdog=panic and panic then. Fix up the panic message to be generic Unconditionally panic on unknown NMI when panic on unknown nmi is enabled. Noticed by Jan Beulich Cc: jbeulich@novell.com
Unified · Split
| @@ -695,7 +695,8 @@ int __kprobes nmi_watchdog_tick(struct pt_regs * regs, unsigned reason) · 694 unmodified lines | ||
| 695 | 695 | */ |
| 696 | 696 | local_inc(&__get_cpu_var(alert_counter)); |
| 697 | 697 | if (local_read(&__get_cpu_var(alert_counter)) == 5*nmi_hz) |
| 698 | − die_nmi("NMI Watchdog detected LOCKUP on CPU %d\n", regs); | |
| 698 | + die_nmi("NMI Watchdog detected LOCKUP on CPU %d\n", regs, | |
| 699 | + panic_on_timeout); | |
| 699 | 700 | } else { |
| 700 | 701 | __get_cpu_var(last_irq_sum) = sum; |
| 701 | 702 | local_set(&__get_cpu_var(alert_counter), 0); |
| @@ -765,7 +766,7 @@ static int unknown_nmi_panic_callback(struct pt_regs *regs, int cpu) · 63 unmodified lines | ||
| 765 | 766 | char buf[64]; |
| 766 | 767 | |
| 767 | 768 | sprintf(buf, "NMI received for unknown reason %02x\n", reason); |
| 768 | − die_nmi(buf,regs); | |
| 769 | + die_nmi(buf, regs, 1); /* Always panic here */ | |
| 769 | 770 | return 0; |
| 770 | 771 | } |
| 771 | 772 | |
| @@ -570,7 +570,7 @@ void die(const char * str, struct pt_regs * regs, long err) · 569 unmodified lines | ||
| 570 | 570 | do_exit(SIGSEGV); |
| 571 | 571 | } |
| 572 | 572 | |
| 573 | −void __kprobes die_nmi(char *str, struct pt_regs *regs) | |
| 573 | +void __kprobes die_nmi(char *str, struct pt_regs *regs, int do_panic) | |
| 574 | 574 | { |
| 575 | 575 | unsigned long flags = oops_begin(); |
| 576 | 576 | |
| @@ -582,9 +582,8 @@ void __kprobes die_nmi(char *str, struct pt_regs *regs) · 5 unmodified lines | ||
| 582 | 582 | show_registers(regs); |
| 583 | 583 | if (kexec_should_crash(current)) |
| 584 | 584 | crash_kexec(regs); |
| 585 | − if (panic_on_timeout || panic_on_oops) | |
| 586 | − panic("nmi watchdog"); | |
| 587 | − printk("console shuts up ...\n"); | |
| 585 | + if (do_panic || panic_on_oops) | |
| 586 | + panic("Non maskable interrupt"); | |
| 588 | 587 | oops_end(flags); |
| 589 | 588 | nmi_exit(); |
| 590 | 589 | local_irq_enable(); |
| @@ -37,7 +37,7 @@ static inline void unset_nmi_pm_callback(struct pm_dev * dev) · 36 unmodified lines | ||
| 37 | 37 | #endif /* CONFIG_PM */ |
| 38 | 38 | |
| 39 | 39 | extern void default_do_nmi(struct pt_regs *); |
| 40 | −extern void die_nmi(char *str, struct pt_regs *regs); | |
| 40 | +extern void die_nmi(char *str, struct pt_regs *regs, int do_panic); | |
| 41 | 41 | |
| 42 | 42 | #define get_nmi_reason() inb(0x61) |
| 43 | 43 | |