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 /kernel | |
| 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>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/hung_task.c | 6 | ||||
| -rw-r--r-- | kernel/sysctl.c | 8 |
2 files changed, 9 insertions, 5 deletions
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 |
