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 /kernel/sysctl.c | |
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>
Diffstat (limited to 'kernel/sysctl.c')
-rw-r--r-- | kernel/sysctl.c | 6 |
1 files changed, 6 insertions, 0 deletions
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", |