blob: fb00cf30abd12f3c958b910051971c1c1f909492
1 | /* |
2 | * Detect Hung Task |
3 | * |
4 | * kernel/hung_task.c - kernel thread for detecting tasks stuck in D state |
5 | * |
6 | */ |
7 | |
8 | #include <linux/mm.h> |
9 | #include <linux/cpu.h> |
10 | #include <linux/nmi.h> |
11 | #include <linux/init.h> |
12 | #include <linux/delay.h> |
13 | #include <linux/freezer.h> |
14 | #include <linux/kthread.h> |
15 | #include <linux/lockdep.h> |
16 | #include <linux/export.h> |
17 | #include <linux/sysctl.h> |
18 | #include <linux/suspend.h> |
19 | #include <linux/utsname.h> |
20 | #include <trace/events/sched.h> |
21 | |
22 | /* |
23 | * The number of tasks checked: |
24 | */ |
25 | int __read_mostly sysctl_hung_task_check_count = PID_MAX_LIMIT; |
26 | |
27 | /* |
28 | * Limit number of tasks checked in a batch. |
29 | * |
30 | * This value controls the preemptibility of khungtaskd since preemption |
31 | * is disabled during the critical section. It also controls the size of |
32 | * the RCU grace period. So it needs to be upper-bound. |
33 | */ |
34 | #define HUNG_TASK_LOCK_BREAK (HZ / 10) |
35 | |
36 | /* |
37 | * Zero means infinite timeout - no checking done: |
38 | */ |
39 | unsigned long __read_mostly sysctl_hung_task_timeout_secs = CONFIG_DEFAULT_HUNG_TASK_TIMEOUT; |
40 | |
41 | int __read_mostly sysctl_hung_task_warnings = 10; |
42 | |
43 | static int __read_mostly did_panic; |
44 | |
45 | static struct task_struct *watchdog_task; |
46 | |
47 | /* |
48 | * Should we panic (and reboot, if panic_timeout= is set) when a |
49 | * hung task is detected: |
50 | */ |
51 | unsigned int __read_mostly sysctl_hung_task_panic = |
52 | CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE; |
53 | |
54 | static int __init hung_task_panic_setup(char *str) |
55 | { |
56 | int rc = kstrtouint(str, 0, &sysctl_hung_task_panic); |
57 | |
58 | if (rc) |
59 | return rc; |
60 | return 1; |
61 | } |
62 | __setup("hung_task_panic=", hung_task_panic_setup); |
63 | |
64 | static int |
65 | hung_task_panic(struct notifier_block *this, unsigned long event, void *ptr) |
66 | { |
67 | did_panic = 1; |
68 | |
69 | return NOTIFY_DONE; |
70 | } |
71 | |
72 | static struct notifier_block panic_block = { |
73 | .notifier_call = hung_task_panic, |
74 | }; |
75 | |
76 | static void check_hung_task(struct task_struct *t, unsigned long timeout) |
77 | { |
78 | unsigned long switch_count = t->nvcsw + t->nivcsw; |
79 | |
80 | /* |
81 | * Ensure the task is not frozen. |
82 | * Also, skip vfork and any other user process that freezer should skip. |
83 | */ |
84 | if (unlikely(t->flags & (PF_FROZEN | PF_FREEZER_SKIP))) |
85 | return; |
86 | |
87 | /* |
88 | * When a freshly created task is scheduled once, changes its state to |
89 | * TASK_UNINTERRUPTIBLE without having ever been switched out once, it |
90 | * musn't be checked. |
91 | */ |
92 | if (unlikely(!switch_count)) |
93 | return; |
94 | |
95 | if (switch_count != t->last_switch_count) { |
96 | t->last_switch_count = switch_count; |
97 | return; |
98 | } |
99 | |
100 | trace_sched_process_hang(t); |
101 | |
102 | if (!sysctl_hung_task_warnings && !sysctl_hung_task_panic) |
103 | return; |
104 | |
105 | /* |
106 | * Ok, the task did not get scheduled for more than 2 minutes, |
107 | * complain: |
108 | */ |
109 | if (sysctl_hung_task_warnings) { |
110 | sysctl_hung_task_warnings--; |
111 | pr_err("INFO: task %s:%d blocked for more than %ld seconds.\n", |
112 | t->comm, t->pid, timeout); |
113 | pr_err(" %s %s %.*s\n", |
114 | print_tainted(), init_utsname()->release, |
115 | (int)strcspn(init_utsname()->version, " "), |
116 | init_utsname()->version); |
117 | pr_err("\"echo 0 > /proc/sys/kernel/hung_task_timeout_secs\"" |
118 | " disables this message.\n"); |
119 | sched_show_task(t); |
120 | debug_show_all_locks(); |
121 | } |
122 | |
123 | touch_nmi_watchdog(); |
124 | |
125 | if (sysctl_hung_task_panic) { |
126 | trigger_all_cpu_backtrace(); |
127 | panic("hung_task: blocked tasks"); |
128 | } |
129 | } |
130 | |
131 | /* |
132 | * To avoid extending the RCU grace period for an unbounded amount of time, |
133 | * periodically exit the critical section and enter a new one. |
134 | * |
135 | * For preemptible RCU it is sufficient to call rcu_read_unlock in order |
136 | * to exit the grace period. For classic RCU, a reschedule is required. |
137 | */ |
138 | static bool rcu_lock_break(struct task_struct *g, struct task_struct *t) |
139 | { |
140 | bool can_cont; |
141 | |
142 | get_task_struct(g); |
143 | get_task_struct(t); |
144 | rcu_read_unlock(); |
145 | cond_resched(); |
146 | rcu_read_lock(); |
147 | can_cont = pid_alive(g) && pid_alive(t); |
148 | put_task_struct(t); |
149 | put_task_struct(g); |
150 | |
151 | return can_cont; |
152 | } |
153 | |
154 | /* |
155 | * Check whether a TASK_UNINTERRUPTIBLE does not get woken up for |
156 | * a really long time (120 seconds). If that happens, print out |
157 | * a warning. |
158 | */ |
159 | static void check_hung_uninterruptible_tasks(unsigned long timeout) |
160 | { |
161 | int max_count = sysctl_hung_task_check_count; |
162 | unsigned long last_break = jiffies; |
163 | struct task_struct *g, *t; |
164 | |
165 | /* |
166 | * If the system crashed already then all bets are off, |
167 | * do not report extra hung tasks: |
168 | */ |
169 | if (test_taint(TAINT_DIE) || did_panic) |
170 | return; |
171 | |
172 | rcu_read_lock(); |
173 | for_each_process_thread(g, t) { |
174 | if (!max_count--) |
175 | goto unlock; |
176 | if (time_after(jiffies, last_break + HUNG_TASK_LOCK_BREAK)) { |
177 | if (!rcu_lock_break(g, t)) |
178 | goto unlock; |
179 | last_break = jiffies; |
180 | } |
181 | /* use "==" to skip the TASK_KILLABLE tasks waiting on NFS */ |
182 | if (t->state == TASK_UNINTERRUPTIBLE) |
183 | check_hung_task(t, timeout); |
184 | } |
185 | unlock: |
186 | rcu_read_unlock(); |
187 | } |
188 | |
189 | static long hung_timeout_jiffies(unsigned long last_checked, |
190 | unsigned long timeout) |
191 | { |
192 | /* timeout of 0 will disable the watchdog */ |
193 | return timeout ? last_checked - jiffies + timeout * HZ : |
194 | MAX_SCHEDULE_TIMEOUT; |
195 | } |
196 | |
197 | /* |
198 | * Process updating of timeout sysctl |
199 | */ |
200 | int proc_dohung_task_timeout_secs(struct ctl_table *table, int write, |
201 | void __user *buffer, |
202 | size_t *lenp, loff_t *ppos) |
203 | { |
204 | int ret; |
205 | |
206 | ret = proc_doulongvec_minmax(table, write, buffer, lenp, ppos); |
207 | |
208 | if (ret || !write) |
209 | goto out; |
210 | |
211 | wake_up_process(watchdog_task); |
212 | |
213 | out: |
214 | return ret; |
215 | } |
216 | |
217 | static atomic_t reset_hung_task = ATOMIC_INIT(0); |
218 | |
219 | void reset_hung_task_detector(void) |
220 | { |
221 | atomic_set(&reset_hung_task, 1); |
222 | } |
223 | EXPORT_SYMBOL_GPL(reset_hung_task_detector); |
224 | |
225 | static bool hung_detector_suspended; |
226 | |
227 | static int hungtask_pm_notify(struct notifier_block *self, |
228 | unsigned long action, void *hcpu) |
229 | { |
230 | switch (action) { |
231 | case PM_SUSPEND_PREPARE: |
232 | case PM_HIBERNATION_PREPARE: |
233 | case PM_RESTORE_PREPARE: |
234 | hung_detector_suspended = true; |
235 | break; |
236 | case PM_POST_SUSPEND: |
237 | case PM_POST_HIBERNATION: |
238 | case PM_POST_RESTORE: |
239 | hung_detector_suspended = false; |
240 | break; |
241 | default: |
242 | break; |
243 | } |
244 | return NOTIFY_OK; |
245 | } |
246 | |
247 | /* |
248 | * kthread which checks for tasks stuck in D state |
249 | */ |
250 | static int watchdog(void *dummy) |
251 | { |
252 | unsigned long hung_last_checked = jiffies; |
253 | |
254 | set_user_nice(current, 0); |
255 | |
256 | for ( ; ; ) { |
257 | unsigned long timeout = sysctl_hung_task_timeout_secs; |
258 | long t = hung_timeout_jiffies(hung_last_checked, timeout); |
259 | |
260 | if (t <= 0) { |
261 | if (!atomic_xchg(&reset_hung_task, 0) && |
262 | !hung_detector_suspended) |
263 | check_hung_uninterruptible_tasks(timeout); |
264 | hung_last_checked = jiffies; |
265 | continue; |
266 | } |
267 | schedule_timeout_interruptible(t); |
268 | } |
269 | |
270 | return 0; |
271 | } |
272 | |
273 | static int __init hung_task_init(void) |
274 | { |
275 | atomic_notifier_chain_register(&panic_notifier_list, &panic_block); |
276 | |
277 | /* Disable hung task detector on suspend */ |
278 | pm_notifier(hungtask_pm_notify, 0); |
279 | |
280 | watchdog_task = kthread_run(watchdog, NULL, "khungtaskd"); |
281 | |
282 | return 0; |
283 | } |
284 | subsys_initcall(hung_task_init); |
285 |