diff options
Diffstat (limited to 'kernel/watchdog.c')
-rw-r--r-- | kernel/watchdog.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/kernel/watchdog.c b/kernel/watchdog.c index f1541b7e3244..57b8e2c25eda 100644 --- a/kernel/watchdog.c +++ b/kernel/watchdog.c | |||
@@ -31,6 +31,7 @@ int watchdog_enabled; | |||
31 | int __read_mostly softlockup_thresh = 60; | 31 | int __read_mostly softlockup_thresh = 60; |
32 | 32 | ||
33 | static DEFINE_PER_CPU(unsigned long, watchdog_touch_ts); | 33 | static DEFINE_PER_CPU(unsigned long, watchdog_touch_ts); |
34 | static DEFINE_PER_CPU(bool, watchdog_nmi_touch); | ||
34 | static DEFINE_PER_CPU(struct task_struct *, softlockup_watchdog); | 35 | static DEFINE_PER_CPU(struct task_struct *, softlockup_watchdog); |
35 | static DEFINE_PER_CPU(struct hrtimer, watchdog_hrtimer); | 36 | static DEFINE_PER_CPU(struct hrtimer, watchdog_hrtimer); |
36 | static DEFINE_PER_CPU(bool, softlockup_touch_sync); | 37 | static DEFINE_PER_CPU(bool, softlockup_touch_sync); |
@@ -139,6 +140,7 @@ void touch_all_softlockup_watchdogs(void) | |||
139 | 140 | ||
140 | void touch_nmi_watchdog(void) | 141 | void touch_nmi_watchdog(void) |
141 | { | 142 | { |
143 | __get_cpu_var(watchdog_nmi_touch) = true; | ||
142 | touch_softlockup_watchdog(); | 144 | touch_softlockup_watchdog(); |
143 | } | 145 | } |
144 | EXPORT_SYMBOL(touch_nmi_watchdog); | 146 | EXPORT_SYMBOL(touch_nmi_watchdog); |
@@ -201,10 +203,9 @@ void watchdog_overflow_callback(struct perf_event *event, int nmi, | |||
201 | struct pt_regs *regs) | 203 | struct pt_regs *regs) |
202 | { | 204 | { |
203 | int this_cpu = smp_processor_id(); | 205 | int this_cpu = smp_processor_id(); |
204 | unsigned long touch_ts = per_cpu(watchdog_touch_ts, this_cpu); | ||
205 | 206 | ||
206 | if (touch_ts == 0) { | 207 | if (__get_cpu_var(watchdog_nmi_touch) == true) { |
207 | __touch_watchdog(); | 208 | __get_cpu_var(watchdog_nmi_touch) = false; |
208 | return; | 209 | return; |
209 | } | 210 | } |
210 | 211 | ||