diff options
author | Liu Hua <sdu.liu@huawei.com> | 2014-04-07 18:38:57 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-07 19:36:07 -0400 |
commit | 80df28476505ed4e6701c3448c63c9229a50c655 (patch) | |
tree | c8c8a1987998a08cf6e74c34b474d8cf705e4114 | |
parent | 2aaf308b95b24649a6dcfed89cd956e972089b2a (diff) |
hung_task: check the value of "sysctl_hung_task_timeout_sec"
As sysctl_hung_task_timeout_sec is unsigned long, when this value is
larger then LONG_MAX/HZ, the function schedule_timeout_interruptible in
watchdog will return immediately without sleep and with print :
schedule_timeout: wrong timeout value ffffffffffffff83
and then the funtion watchdog will call schedule_timeout_interruptible
again and again. The screen will be filled with
"schedule_timeout: wrong timeout value ffffffffffffff83"
This patch does some check and correction in sysctl, to let the function
schedule_timeout_interruptible allways get the valid parameter.
Signed-off-by: Liu Hua <sdu.liu@huawei.com>
Tested-by: Satoru Takeuchi <satoru.takeuchi@gmail.com>
Cc: <stable@vger.kernel.org> [3.4+]
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | Documentation/sysctl/kernel.txt | 1 | ||||
-rw-r--r-- | kernel/sysctl.c | 6 |
2 files changed, 7 insertions, 0 deletions
diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt index 271a09db6629..9886c3d57fc2 100644 --- a/Documentation/sysctl/kernel.txt +++ b/Documentation/sysctl/kernel.txt | |||
@@ -317,6 +317,7 @@ for more than this value report a warning. | |||
317 | This file shows up if CONFIG_DETECT_HUNG_TASK is enabled. | 317 | This file shows up if CONFIG_DETECT_HUNG_TASK is enabled. |
318 | 318 | ||
319 | 0: means infinite timeout - no checking done. | 319 | 0: means infinite timeout - no checking done. |
320 | Possible values to set are in range {0..LONG_MAX/HZ}. | ||
320 | 321 | ||
321 | ============================================================== | 322 | ============================================================== |
322 | 323 | ||
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 5c14b547882e..74f5b580fe34 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
@@ -141,6 +141,11 @@ static int min_percpu_pagelist_fract = 8; | |||
141 | static int ngroups_max = NGROUPS_MAX; | 141 | static int ngroups_max = NGROUPS_MAX; |
142 | static const int cap_last_cap = CAP_LAST_CAP; | 142 | static const int cap_last_cap = CAP_LAST_CAP; |
143 | 143 | ||
144 | /*this is needed for proc_doulongvec_minmax of sysctl_hung_task_timeout_secs */ | ||
145 | #ifdef CONFIG_DETECT_HUNG_TASK | ||
146 | static unsigned long hung_task_timeout_max = (LONG_MAX/HZ); | ||
147 | #endif | ||
148 | |||
144 | #ifdef CONFIG_INOTIFY_USER | 149 | #ifdef CONFIG_INOTIFY_USER |
145 | #include <linux/inotify.h> | 150 | #include <linux/inotify.h> |
146 | #endif | 151 | #endif |
@@ -985,6 +990,7 @@ static struct ctl_table kern_table[] = { | |||
985 | .maxlen = sizeof(unsigned long), | 990 | .maxlen = sizeof(unsigned long), |
986 | .mode = 0644, | 991 | .mode = 0644, |
987 | .proc_handler = proc_dohung_task_timeout_secs, | 992 | .proc_handler = proc_dohung_task_timeout_secs, |
993 | .extra2 = &hung_task_timeout_max, | ||
988 | }, | 994 | }, |
989 | { | 995 | { |
990 | .procname = "hung_task_warnings", | 996 | .procname = "hung_task_warnings", |