OSDN Git Service

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