Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | |
| 2 | [NMI watchdog is available for x86 and x86-64 architectures] |
| 3 | |
| 4 | Is your system locking up unpredictably? No keyboard activity, just |
| 5 | a frustrating complete hard lockup? Do you want to help us debugging |
| 6 | such lockups? If all yes then this document is definitely for you. |
| 7 | |
| 8 | On many x86/x86-64 type hardware there is a feature that enables |
| 9 | us to generate 'watchdog NMI interrupts'. (NMI: Non Maskable Interrupt |
| 10 | which get executed even if the system is otherwise locked up hard). |
| 11 | This can be used to debug hard kernel lockups. By executing periodic |
| 12 | NMI interrupts, the kernel can monitor whether any CPU has locked up, |
| 13 | and print out debugging messages if so. |
| 14 | |
| 15 | In order to use the NMI watchdog, you need to have APIC support in your |
| 16 | kernel. For SMP kernels, APIC support gets compiled in automatically. For |
| 17 | UP, enable either CONFIG_X86_UP_APIC (Processor type and features -> Local |
| 18 | APIC support on uniprocessors) or CONFIG_X86_UP_IOAPIC (Processor type and |
| 19 | features -> IO-APIC support on uniprocessors) in your kernel config. |
| 20 | CONFIG_X86_UP_APIC is for uniprocessor machines without an IO-APIC. |
| 21 | CONFIG_X86_UP_IOAPIC is for uniprocessor with an IO-APIC. [Note: certain |
| 22 | kernel debugging options, such as Kernel Stack Meter or Kernel Tracer, |
| 23 | may implicitly disable the NMI watchdog.] |
| 24 | |
| 25 | For x86-64, the needed APIC is always compiled in, and the NMI watchdog is |
Marcin Slusarz | 5abbcf2 | 2008-03-23 21:06:30 +0100 | [diff] [blame] | 26 | always enabled with I/O-APIC mode (nmi_watchdog=1). |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 27 | |
| 28 | Using local APIC (nmi_watchdog=2) needs the first performance register, so |
| 29 | you can't use it for other purposes (such as high precision performance |
| 30 | profiling.) However, at least oprofile and the perfctr driver disable the |
| 31 | local APIC NMI watchdog automatically. |
| 32 | |
| 33 | To actually enable the NMI watchdog, use the 'nmi_watchdog=N' boot |
| 34 | parameter. Eg. the relevant lilo.conf entry: |
| 35 | |
| 36 | append="nmi_watchdog=1" |
| 37 | |
| 38 | For SMP machines and UP machines with an IO-APIC use nmi_watchdog=1. |
| 39 | For UP machines without an IO-APIC use nmi_watchdog=2, this only works |
| 40 | for some processor types. If in doubt, boot with nmi_watchdog=1 and |
| 41 | check the NMI count in /proc/interrupts; if the count is zero then |
| 42 | reboot with nmi_watchdog=2 and check the NMI count. If it is still |
| 43 | zero then log a problem, you probably have a processor that needs to be |
| 44 | added to the nmi code. |
| 45 | |
| 46 | A 'lockup' is the following scenario: if any CPU in the system does not |
| 47 | execute the period local timer interrupt for more than 5 seconds, then |
| 48 | the NMI handler generates an oops and kills the process. This |
| 49 | 'controlled crash' (and the resulting kernel messages) can be used to |
| 50 | debug the lockup. Thus whenever the lockup happens, wait 5 seconds and |
| 51 | the oops will show up automatically. If the kernel produces no messages |
| 52 | then the system has crashed so hard (eg. hardware-wise) that either it |
| 53 | cannot even accept NMI interrupts, or the crash has made the kernel |
| 54 | unable to print messages. |
| 55 | |
| 56 | Be aware that when using local APIC, the frequency of NMI interrupts |
| 57 | it generates, depends on the system load. The local APIC NMI watchdog, |
| 58 | lacking a better source, uses the "cycles unhalted" event. As you may |
| 59 | guess it doesn't tick when the CPU is in the halted state (which happens |
| 60 | when the system is idle), but if your system locks up on anything but the |
| 61 | "hlt" processor instruction, the watchdog will trigger very soon as the |
| 62 | "cycles unhalted" event will happen every clock tick. If it locks up on |
| 63 | "hlt", then you are out of luck -- the event will not happen at all and the |
| 64 | watchdog won't trigger. This is a shortcoming of the local APIC watchdog |
| 65 | -- unfortunately there is no "clock ticks" event that would work all the |
| 66 | time. The I/O APIC watchdog is driven externally and has no such shortcoming. |
| 67 | But its NMI frequency is much higher, resulting in a more significant hit |
| 68 | to the overall system performance. |
| 69 | |
| 70 | NOTE: starting with 2.4.2-ac18 the NMI-oopser is disabled by default, |
| 71 | you have to enable it with a boot time parameter. Prior to 2.4.2-ac18 |
| 72 | the NMI-oopser is enabled unconditionally on x86 SMP boxes. |
| 73 | |
| 74 | On x86-64 the NMI oopser is on by default. On 64bit Intel CPUs |
| 75 | it uses IO-APIC by default and on AMD it uses local APIC. |
| 76 | |
| 77 | [ feel free to send bug reports, suggestions and patches to |
| 78 | Ingo Molnar <mingo@redhat.com> or the Linux SMP mailing |
| 79 | list at <linux-smp@vger.kernel.org> ] |
| 80 | |