diff options
-rw-r--r-- | include/linux/sched.h | 4 | ||||
-rw-r--r-- | kernel/sched.c | 2 | ||||
-rw-r--r-- | kernel/softlockup.c | 15 |
3 files changed, 19 insertions, 2 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h index d464bd0d6578..6312521df2c1 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -226,6 +226,7 @@ extern void scheduler_tick(void); | |||
226 | extern void softlockup_tick(void); | 226 | extern void softlockup_tick(void); |
227 | extern void spawn_softlockup_task(void); | 227 | extern void spawn_softlockup_task(void); |
228 | extern void touch_softlockup_watchdog(void); | 228 | extern void touch_softlockup_watchdog(void); |
229 | extern void touch_all_softlockup_watchdogs(void); | ||
229 | #else | 230 | #else |
230 | static inline void softlockup_tick(void) | 231 | static inline void softlockup_tick(void) |
231 | { | 232 | { |
@@ -236,6 +237,9 @@ static inline void spawn_softlockup_task(void) | |||
236 | static inline void touch_softlockup_watchdog(void) | 237 | static inline void touch_softlockup_watchdog(void) |
237 | { | 238 | { |
238 | } | 239 | } |
240 | static inline void touch_all_softlockup_watchdogs(void) | ||
241 | { | ||
242 | } | ||
239 | #endif | 243 | #endif |
240 | 244 | ||
241 | 245 | ||
diff --git a/kernel/sched.c b/kernel/sched.c index 0227f1625a75..5530ed211f72 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -4750,6 +4750,8 @@ void show_state_filter(unsigned long state_filter) | |||
4750 | show_task(p); | 4750 | show_task(p); |
4751 | } while_each_thread(g, p); | 4751 | } while_each_thread(g, p); |
4752 | 4752 | ||
4753 | touch_all_softlockup_watchdogs(); | ||
4754 | |||
4753 | read_unlock(&tasklist_lock); | 4755 | read_unlock(&tasklist_lock); |
4754 | /* | 4756 | /* |
4755 | * Only show locks if all tasks are dumped: | 4757 | * Only show locks if all tasks are dumped: |
diff --git a/kernel/softlockup.c b/kernel/softlockup.c index 5ea631742dbc..8fa7040247ad 100644 --- a/kernel/softlockup.c +++ b/kernel/softlockup.c | |||
@@ -50,6 +50,16 @@ void touch_softlockup_watchdog(void) | |||
50 | } | 50 | } |
51 | EXPORT_SYMBOL(touch_softlockup_watchdog); | 51 | EXPORT_SYMBOL(touch_softlockup_watchdog); |
52 | 52 | ||
53 | void touch_all_softlockup_watchdogs(void) | ||
54 | { | ||
55 | int cpu; | ||
56 | |||
57 | /* Cause each CPU to re-update its timestamp rather than complain */ | ||
58 | for_each_online_cpu(cpu) | ||
59 | per_cpu(touch_timestamp, cpu) = 0; | ||
60 | } | ||
61 | EXPORT_SYMBOL(touch_all_softlockup_watchdogs); | ||
62 | |||
53 | /* | 63 | /* |
54 | * This callback runs from the timer interrupt, and checks | 64 | * This callback runs from the timer interrupt, and checks |
55 | * whether the watchdog thread has hung or not: | 65 | * whether the watchdog thread has hung or not: |
@@ -61,9 +71,10 @@ void softlockup_tick(void) | |||
61 | unsigned long print_timestamp; | 71 | unsigned long print_timestamp; |
62 | unsigned long now; | 72 | unsigned long now; |
63 | 73 | ||
64 | /* watchdog task hasn't updated timestamp yet */ | 74 | if (touch_timestamp == 0) { |
65 | if (touch_timestamp == 0) | 75 | touch_softlockup_watchdog(); |
66 | return; | 76 | return; |
77 | } | ||
67 | 78 | ||
68 | print_timestamp = per_cpu(print_timestamp, this_cpu); | 79 | print_timestamp = per_cpu(print_timestamp, this_cpu); |
69 | 80 | ||