hung_task: allow hung_task_panic when hung_task_warnings is 0
authorJohn Siddle <jsiddle@redhat.com>
Sat, 10 Sep 2016 10:36:36 +0000 (20:36 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Tue, 13 Sep 2016 03:57:02 +0000 (13:57 +1000)
Previously hung_task_panic would not be respected if enabled after
hung_task_warnings had already been decremented to 0.

Permit the kernel to panic if hung_task_panic is enabled after
hung_task_warnings has already been decremented to 0 and another task
hangs for hung_task_timeout_secs seconds.

Check if hung_task_panic is enabled so we don't return prematurely, and
check if hung_task_warnings is non-zero so we don't print the warning
unnecessarily.

Link: http://lkml.kernel.org/r/1473450214-4049-1-git-send-email-jsiddle@redhat.com
Signed-off-by: John Siddle <jsiddle@redhat.com>
Cc: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
kernel/hung_task.c

index 432c3d71d19536b0f468ec84ecc15d2300752103..dbf58050f3fa0f62e0cc33272046593d611bb5de 100644 (file)
@@ -98,7 +98,7 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout)
 
        trace_sched_process_hang(t);
 
-       if (!sysctl_hung_task_warnings)
+       if (!sysctl_hung_task_warnings && !sysctl_hung_task_panic)
                return;
 
        if (sysctl_hung_task_warnings > 0)
@@ -108,16 +108,18 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout)
         * Ok, the task did not get scheduled for more than 2 minutes,
         * complain:
         */
-       pr_err("INFO: task %s:%d blocked for more than %ld seconds.\n",
-               t->comm, t->pid, timeout);
-       pr_err("      %s %s %.*s\n",
-               print_tainted(), init_utsname()->release,
-               (int)strcspn(init_utsname()->version, " "),
-               init_utsname()->version);
-       pr_err("\"echo 0 > /proc/sys/kernel/hung_task_timeout_secs\""
-               " disables this message.\n");
-       sched_show_task(t);
-       debug_show_all_locks();
+       if (sysctl_hung_task_warnings) {
+               pr_err("INFO: task %s:%d blocked for more than %ld seconds.\n",
+                       t->comm, t->pid, timeout);
+               pr_err("      %s %s %.*s\n",
+                       print_tainted(), init_utsname()->release,
+                       (int)strcspn(init_utsname()->version, " "),
+                       init_utsname()->version);
+               pr_err("\"echo 0 > /proc/sys/kernel/hung_task_timeout_secs\""
+                       " disables this message.\n");
+               sched_show_task(t);
+               debug_show_all_locks();
+       }
 
        touch_nmi_watchdog();
 
This page took 0.025152 seconds and 5 git commands to generate.