sched: account system time properly
[safe/jmp/linux-2.6] / kernel / freezer.c
index cb0931f..2f4936c 100644 (file)
@@ -120,3 +120,35 @@ void cancel_freezing(struct task_struct *p)
                spin_unlock_irqrestore(&p->sighand->siglock, flags);
        }
 }
+
+static int __thaw_process(struct task_struct *p)
+{
+       if (frozen(p)) {
+               p->flags &= ~PF_FROZEN;
+               return 1;
+       }
+       clear_freeze_flag(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);
+       if (__thaw_process(p) == 1) {
+               task_unlock(p);
+               wake_up_process(p);
+               return 1;
+       }
+       task_unlock(p);
+       return 0;
+}
+EXPORT_SYMBOL(thaw_process);