diff options
Diffstat (limited to 'arch/x86/kernel/nmi.c')
| -rw-r--r-- | arch/x86/kernel/nmi.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c index ac6d51222e7d..abb78a2cc4ad 100644 --- a/arch/x86/kernel/nmi.c +++ b/arch/x86/kernel/nmi.c | |||
| @@ -114,6 +114,23 @@ static __init void nmi_cpu_busy(void *data) | |||
| 114 | } | 114 | } |
| 115 | #endif | 115 | #endif |
| 116 | 116 | ||
| 117 | static void report_broken_nmi(int cpu, int *prev_nmi_count) | ||
| 118 | { | ||
| 119 | printk(KERN_CONT "\n"); | ||
| 120 | |||
| 121 | printk(KERN_WARNING | ||
| 122 | "WARNING: CPU#%d: NMI appears to be stuck (%d->%d)!\n", | ||
| 123 | cpu, prev_nmi_count[cpu], get_nmi_count(cpu)); | ||
| 124 | |||
| 125 | printk(KERN_WARNING | ||
| 126 | "Please report this to bugzilla.kernel.org,\n"); | ||
| 127 | printk(KERN_WARNING | ||
| 128 | "and attach the output of the 'dmesg' command.\n"); | ||
| 129 | |||
| 130 | per_cpu(wd_enabled, cpu) = 0; | ||
| 131 | atomic_dec(&nmi_active); | ||
| 132 | } | ||
| 133 | |||
| 117 | int __init check_nmi_watchdog(void) | 134 | int __init check_nmi_watchdog(void) |
| 118 | { | 135 | { |
| 119 | unsigned int *prev_nmi_count; | 136 | unsigned int *prev_nmi_count; |
| @@ -141,15 +158,8 @@ int __init check_nmi_watchdog(void) | |||
| 141 | for_each_online_cpu(cpu) { | 158 | for_each_online_cpu(cpu) { |
| 142 | if (!per_cpu(wd_enabled, cpu)) | 159 | if (!per_cpu(wd_enabled, cpu)) |
| 143 | continue; | 160 | continue; |
| 144 | if (get_nmi_count(cpu) - prev_nmi_count[cpu] <= 5) { | 161 | if (get_nmi_count(cpu) - prev_nmi_count[cpu] <= 5) |
| 145 | printk(KERN_WARNING "WARNING: CPU#%d: NMI " | 162 | report_broken_nmi(cpu, prev_nmi_count); |
| 146 | "appears to be stuck (%d->%d)!\n", | ||
| 147 | cpu, | ||
| 148 | prev_nmi_count[cpu], | ||
| 149 | get_nmi_count(cpu)); | ||
| 150 | per_cpu(wd_enabled, cpu) = 0; | ||
| 151 | atomic_dec(&nmi_active); | ||
| 152 | } | ||
| 153 | } | 163 | } |
| 154 | endflag = 1; | 164 | endflag = 1; |
| 155 | if (!atomic_read(&nmi_active)) { | 165 | if (!atomic_read(&nmi_active)) { |
