ARC: Fix PAE40 boot failures due to PTE truncation
[deliverable/linux.git] / kernel / hung_task.c
index e0f90c2b57aa831ac978f70e5730830f52bcd5c7..d234022805dcb5c5b8b169c92fde5956b5b0ce79 100644 (file)
@@ -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;
This page took 0.024346 seconds and 5 git commands to generate.