diff options
author | Aaron Tomlin <atomlin@redhat.com> | 2014-01-20 12:34:13 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2014-01-25 06:13:33 -0500 |
commit | 270750dbc18a71b23d660df110e433ff9616a2d4 (patch) | |
tree | 9b0400fc3713bd02d31835e8d0315cfbd7ccd912 | |
parent | 2397efb1bb17595b35f31abb40d95074ebc04f1b (diff) |
hung_task: Display every hung task warning
When khungtaskd detects hung tasks, it prints out
backtraces from a number of those tasks.
Limiting the number of backtraces being printed
out can result in the user not seeing the information
necessary to debug the issue. The hung_task_warnings
sysctl controls this feature.
This patch makes it possible for hung_task_warnings
to accept a special value to print an unlimited
number of backtraces when khungtaskd detects hung
tasks.
The special value is -1. To use this value it is
necessary to change types from ulong to int.
Signed-off-by: Aaron Tomlin <atomlin@redhat.com>
Reviewed-by: Rik van Riel <riel@redhat.com>
Acked-by: David Rientjes <rientjes@google.com>
Cc: oleg@redhat.com
Link: http://lkml.kernel.org/r/1390239253-24030-3-git-send-email-atomlin@redhat.com
[ Build warning fix. ]
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | Documentation/sysctl/kernel.txt | 42 | ||||
-rw-r--r-- | include/linux/sched/sysctl.h | 2 | ||||
-rw-r--r-- | kernel/hung_task.c | 6 | ||||
-rw-r--r-- | kernel/sysctl.c | 8 |
4 files changed, 52 insertions, 6 deletions
diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt index 6d486404200e..4205f3c05cbe 100644 --- a/Documentation/sysctl/kernel.txt +++ b/Documentation/sysctl/kernel.txt | |||
@@ -33,6 +33,10 @@ show up in /proc/sys/kernel: | |||
33 | - domainname | 33 | - domainname |
34 | - hostname | 34 | - hostname |
35 | - hotplug | 35 | - hotplug |
36 | - hung_task_panic | ||
37 | - hung_task_check_count | ||
38 | - hung_task_timeout_secs | ||
39 | - hung_task_warnings | ||
36 | - kptr_restrict | 40 | - kptr_restrict |
37 | - kstack_depth_to_print [ X86 only ] | 41 | - kstack_depth_to_print [ X86 only ] |
38 | - l2cr [ PPC only ] | 42 | - l2cr [ PPC only ] |
@@ -287,6 +291,44 @@ Default value is "/sbin/hotplug". | |||
287 | 291 | ||
288 | ============================================================== | 292 | ============================================================== |
289 | 293 | ||
294 | hung_task_panic: | ||
295 | |||
296 | Controls the kernel's behavior when a hung task is detected. | ||
297 | This file shows up if CONFIG_DETECT_HUNG_TASK is enabled. | ||
298 | |||
299 | 0: continue operation. This is the default behavior. | ||
300 | |||
301 | 1: panic immediately. | ||
302 | |||
303 | ============================================================== | ||
304 | |||
305 | hung_task_check_count: | ||
306 | |||
307 | The upper bound on the number of tasks that are checked. | ||
308 | This file shows up if CONFIG_DETECT_HUNG_TASK is enabled. | ||
309 | |||
310 | ============================================================== | ||
311 | |||
312 | hung_task_timeout_secs: | ||
313 | |||
314 | Check interval. When a task in D state did not get scheduled | ||
315 | for more than this value report a warning. | ||
316 | This file shows up if CONFIG_DETECT_HUNG_TASK is enabled. | ||
317 | |||
318 | 0: means infinite timeout - no checking done. | ||
319 | |||
320 | ============================================================== | ||
321 | |||
322 | hung_task_warning: | ||
323 | |||
324 | The maximum number of warnings to report. During a check interval | ||
325 | When this value is reached, no more the warnings will be reported. | ||
326 | This file shows up if CONFIG_DETECT_HUNG_TASK is enabled. | ||
327 | |||
328 | -1: report an infinite number of warnings. | ||
329 | |||
330 | ============================================================== | ||
331 | |||
290 | kptr_restrict: | 332 | kptr_restrict: |
291 | 333 | ||
292 | This toggle indicates whether restrictions are placed on | 334 | This toggle indicates whether restrictions are placed on |
diff --git a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h index 31e0193cb0c5..3a93f842306a 100644 --- a/include/linux/sched/sysctl.h +++ b/include/linux/sched/sysctl.h | |||
@@ -5,7 +5,7 @@ | |||
5 | extern int sysctl_hung_task_check_count; | 5 | extern int sysctl_hung_task_check_count; |
6 | extern unsigned int sysctl_hung_task_panic; | 6 | extern unsigned int sysctl_hung_task_panic; |
7 | extern unsigned long sysctl_hung_task_timeout_secs; | 7 | extern unsigned long sysctl_hung_task_timeout_secs; |
8 | extern unsigned long sysctl_hung_task_warnings; | 8 | extern int sysctl_hung_task_warnings; |
9 | extern int proc_dohung_task_timeout_secs(struct ctl_table *table, int write, | 9 | extern int proc_dohung_task_timeout_secs(struct ctl_table *table, int write, |
10 | void __user *buffer, | 10 | void __user *buffer, |
11 | size_t *lenp, loff_t *ppos); | 11 | size_t *lenp, loff_t *ppos); |
diff --git a/kernel/hung_task.c b/kernel/hung_task.c index 9328b80eaf14..0b9c169d577f 100644 --- a/kernel/hung_task.c +++ b/kernel/hung_task.c | |||
@@ -37,7 +37,7 @@ int __read_mostly sysctl_hung_task_check_count = PID_MAX_LIMIT; | |||
37 | */ | 37 | */ |
38 | unsigned long __read_mostly sysctl_hung_task_timeout_secs = CONFIG_DEFAULT_HUNG_TASK_TIMEOUT; | 38 | unsigned long __read_mostly sysctl_hung_task_timeout_secs = CONFIG_DEFAULT_HUNG_TASK_TIMEOUT; |
39 | 39 | ||
40 | unsigned long __read_mostly sysctl_hung_task_warnings = 10; | 40 | int __read_mostly sysctl_hung_task_warnings = 10; |
41 | 41 | ||
42 | static int __read_mostly did_panic; | 42 | static int __read_mostly did_panic; |
43 | 43 | ||
@@ -98,7 +98,9 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout) | |||
98 | 98 | ||
99 | if (!sysctl_hung_task_warnings) | 99 | if (!sysctl_hung_task_warnings) |
100 | return; | 100 | return; |
101 | sysctl_hung_task_warnings--; | 101 | |
102 | if (sysctl_hung_task_warnings > 0) | ||
103 | sysctl_hung_task_warnings--; | ||
102 | 104 | ||
103 | /* | 105 | /* |
104 | * Ok, the task did not get scheduled for more than 2 minutes, | 106 | * Ok, the task did not get scheduled for more than 2 minutes, |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index c398a58673a7..dd5b4496637e 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
@@ -122,7 +122,8 @@ extern int blk_iopoll_enabled; | |||
122 | static int sixty = 60; | 122 | static int sixty = 60; |
123 | #endif | 123 | #endif |
124 | 124 | ||
125 | static int neg_one = -1; | 125 | static int __maybe_unused neg_one = -1; |
126 | |||
126 | static int zero; | 127 | static int zero; |
127 | static int __maybe_unused one = 1; | 128 | static int __maybe_unused one = 1; |
128 | static int __maybe_unused two = 2; | 129 | static int __maybe_unused two = 2; |
@@ -978,9 +979,10 @@ static struct ctl_table kern_table[] = { | |||
978 | { | 979 | { |
979 | .procname = "hung_task_warnings", | 980 | .procname = "hung_task_warnings", |
980 | .data = &sysctl_hung_task_warnings, | 981 | .data = &sysctl_hung_task_warnings, |
981 | .maxlen = sizeof(unsigned long), | 982 | .maxlen = sizeof(int), |
982 | .mode = 0644, | 983 | .mode = 0644, |
983 | .proc_handler = proc_doulongvec_minmax, | 984 | .proc_handler = proc_dointvec_minmax, |
985 | .extra1 = &neg_one, | ||
984 | }, | 986 | }, |
985 | #endif | 987 | #endif |
986 | #ifdef CONFIG_COMPAT | 988 | #ifdef CONFIG_COMPAT |