time: Fix accumulation bug triggered by long delay.
[safe/jmp/linux-2.6] / kernel / freezer.c
index ba6248b..bd1d42b 100644 (file)
@@ -44,12 +44,19 @@ void refrigerator(void)
        recalc_sigpending(); /* We sent fake signal, clean it up */
        spin_unlock_irq(&current->sighand->siglock);
 
+       /* prevent accounting of that task to load */
+       current->flags |= PF_FREEZING;
+
        for (;;) {
                set_current_state(TASK_UNINTERRUPTIBLE);
                if (!frozen(current))
                        break;
                schedule();
        }
+
+       /* Remove the accounting blocker */
+       current->flags &= ~PF_FREEZING;
+
        pr_debug("%s left refrigerator\n", current->comm);
        __set_current_state(save);
 }
@@ -121,16 +128,7 @@ void cancel_freezing(struct task_struct *p)
        }
 }
 
-/*
- * Wake up a frozen process
- *
- * task_lock() is needed to prevent the race with refrigerator() which may
- * occur if the freezing of tasks fails.  Namely, without the lock, if the
- * freezing of tasks failed, thaw_tasks() might have run before a task in
- * refrigerator() could call frozen_process(), in which case the task would be
- * frozen and no one would thaw it.
- */
-int __thaw_process(struct task_struct *p)
+static int __thaw_process(struct task_struct *p)
 {
        if (frozen(p)) {
                p->flags &= ~PF_FROZEN;
@@ -140,6 +138,15 @@ int __thaw_process(struct task_struct *p)
        return 0;
 }
 
+/*
+ * Wake up a frozen process
+ *
+ * task_lock() is needed to prevent the race with refrigerator() which may
+ * occur if the freezing of tasks fails.  Namely, without the lock, if the
+ * freezing of tasks failed, thaw_tasks() might have run before a task in
+ * refrigerator() could call frozen_process(), in which case the task would be
+ * frozen and no one would thaw it.
+ */
 int thaw_process(struct task_struct *p)
 {
        task_lock(p);