diff options
| author | Rafael J. Wysocki <[email protected]> | 2016-04-25 15:44:01 +0200 |
|---|---|---|
| committer | Rafael J. Wysocki <[email protected]> | 2016-04-25 15:44:01 +0200 |
| commit | 1cbc99dfe5d7d686fd022647f4e489b5eb8e9068 (patch) | |
| tree | 735e0254f6f491442d75e683eb9eb3c7ac685111 /kernel/hung_task.c | |
| parent | 94862a62dfe3ba1c7601115a2dc80721c5b256f0 (diff) | |
| parent | 8cee1eed8e78143aa2ed60308fb88e2d6fa46205 (diff) | |
Merge back cpufreq changes for v4.7.
Diffstat (limited to 'kernel/hung_task.c')
| -rw-r--r-- | kernel/hung_task.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/kernel/hung_task.c b/kernel/hung_task.c index e0f90c2b57aa..d234022805dc 100644 --- a/kernel/hung_task.c +++ b/kernel/hung_task.c @@ -185,10 +185,12 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout) rcu_read_unlock(); } -static unsigned long timeout_jiffies(unsigned long timeout) +static long hung_timeout_jiffies(unsigned long last_checked, + unsigned long timeout) { /* timeout of 0 will disable the watchdog */ - return timeout ? timeout * HZ : MAX_SCHEDULE_TIMEOUT; + return timeout ? last_checked - jiffies + timeout * HZ : + MAX_SCHEDULE_TIMEOUT; } /* @@ -224,18 +226,21 @@ EXPORT_SYMBOL_GPL(reset_hung_task_detector); */ static int watchdog(void *dummy) { + unsigned long hung_last_checked = jiffies; + set_user_nice(current, 0); for ( ; ; ) { unsigned long timeout = sysctl_hung_task_timeout_secs; + long t = hung_timeout_jiffies(hung_last_checked, timeout); - while (schedule_timeout_interruptible(timeout_jiffies(timeout))) - timeout = sysctl_hung_task_timeout_secs; - - if (atomic_xchg(&reset_hung_task, 0)) + if (t <= 0) { + if (!atomic_xchg(&reset_hung_task, 0)) + check_hung_uninterruptible_tasks(timeout); + hung_last_checked = jiffies; continue; - - check_hung_uninterruptible_tasks(timeout); + } + schedule_timeout_interruptible(t); } return 0; |