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); 260