diff options
Diffstat (limited to 'kernel/watchdog.c')
| -rw-r--r-- | kernel/watchdog.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/kernel/watchdog.c b/kernel/watchdog.c index 613bc1f04610..7f9c3c52ecc1 100644 --- a/kernel/watchdog.c +++ b/kernel/watchdog.c | |||
| @@ -122,7 +122,7 @@ static void __touch_watchdog(void) | |||
| 122 | 122 | ||
| 123 | void touch_softlockup_watchdog(void) | 123 | void touch_softlockup_watchdog(void) |
| 124 | { | 124 | { |
| 125 | __get_cpu_var(watchdog_touch_ts) = 0; | 125 | __raw_get_cpu_var(watchdog_touch_ts) = 0; |
| 126 | } | 126 | } |
| 127 | EXPORT_SYMBOL(touch_softlockup_watchdog); | 127 | EXPORT_SYMBOL(touch_softlockup_watchdog); |
| 128 | 128 | ||
| @@ -142,7 +142,14 @@ void touch_all_softlockup_watchdogs(void) | |||
| 142 | #ifdef CONFIG_HARDLOCKUP_DETECTOR | 142 | #ifdef CONFIG_HARDLOCKUP_DETECTOR |
| 143 | void touch_nmi_watchdog(void) | 143 | void touch_nmi_watchdog(void) |
| 144 | { | 144 | { |
| 145 | __get_cpu_var(watchdog_nmi_touch) = true; | 145 | if (watchdog_enabled) { |
| 146 | unsigned cpu; | ||
| 147 | |||
| 148 | for_each_present_cpu(cpu) { | ||
| 149 | if (per_cpu(watchdog_nmi_touch, cpu) != true) | ||
| 150 | per_cpu(watchdog_nmi_touch, cpu) = true; | ||
| 151 | } | ||
| 152 | } | ||
| 146 | touch_softlockup_watchdog(); | 153 | touch_softlockup_watchdog(); |
| 147 | } | 154 | } |
| 148 | EXPORT_SYMBOL(touch_nmi_watchdog); | 155 | EXPORT_SYMBOL(touch_nmi_watchdog); |
| @@ -206,6 +213,9 @@ void watchdog_overflow_callback(struct perf_event *event, int nmi, | |||
| 206 | struct perf_sample_data *data, | 213 | struct perf_sample_data *data, |
| 207 | struct pt_regs *regs) | 214 | struct pt_regs *regs) |
| 208 | { | 215 | { |
| 216 | /* Ensure the watchdog never gets throttled */ | ||
| 217 | event->hw.interrupts = 0; | ||
| 218 | |||
| 209 | if (__get_cpu_var(watchdog_nmi_touch) == true) { | 219 | if (__get_cpu_var(watchdog_nmi_touch) == true) { |
| 210 | __get_cpu_var(watchdog_nmi_touch) = false; | 220 | __get_cpu_var(watchdog_nmi_touch) = false; |
| 211 | return; | 221 | return; |
| @@ -430,6 +440,9 @@ static int watchdog_enable(int cpu) | |||
| 430 | wake_up_process(p); | 440 | wake_up_process(p); |
| 431 | } | 441 | } |
| 432 | 442 | ||
| 443 | /* if any cpu succeeds, watchdog is considered enabled for the system */ | ||
| 444 | watchdog_enabled = 1; | ||
| 445 | |||
| 433 | return 0; | 446 | return 0; |
| 434 | } | 447 | } |
| 435 | 448 | ||
| @@ -452,9 +465,6 @@ static void watchdog_disable(int cpu) | |||
| 452 | per_cpu(softlockup_watchdog, cpu) = NULL; | 465 | per_cpu(softlockup_watchdog, cpu) = NULL; |
| 453 | kthread_stop(p); | 466 | kthread_stop(p); |
| 454 | } | 467 | } |
| 455 | |||
| 456 | /* if any cpu succeeds, watchdog is considered enabled for the system */ | ||
| 457 | watchdog_enabled = 1; | ||
| 458 | } | 468 | } |
| 459 | 469 | ||
| 460 | static void watchdog_enable_all_cpus(void) | 470 | static void watchdog_enable_all_cpus(void) |
