summaryrefslogtreecommitdiff
path: root/kernel/power/process.c
diff options
context:
space:
mode:
authorPatrick Mochel <mochel@osdl.org>2003-08-04 02:08:22 -0700
committerPatrick Mochel <mochel@osdl.org>2003-08-04 02:08:22 -0700
commit45a8d2842d6dee53ba5130734abfc602856efdaa (patch)
tree6391cad6b11ee01a8abb96bc7050f6ff8470eed1 /kernel/power/process.c
parent8cf4ddc34151b35f56fc08196e5a39be18c9b344 (diff)
[power] Fix up refrigerator to work with ^Z-ed processes
Originally from Pavel Machek: schedule() added makes processes start at exactly that point, making printouts nicer.
Diffstat (limited to 'kernel/power/process.c')
-rw-r--r--kernel/power/process.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/kernel/power/process.c b/kernel/power/process.c
index bd80a35f5e6a..671730612e0f 100644
--- a/kernel/power/process.c
+++ b/kernel/power/process.c
@@ -23,14 +23,16 @@
*/
#define TIMEOUT (6 * HZ)
-#define INTERESTING(p) \
- /* We don't want to touch kernel_threads..*/ \
- if (p->flags & PF_IOTHREAD) \
- continue; \
- if (p == current) \
- continue; \
- if (p->state == TASK_ZOMBIE) \
- continue;
+
+static inline int freezeable(struct task_struct * p)
+{
+ if ((p == current) ||
+ (p->flags & PF_IOTHREAD) ||
+ (p->state == TASK_ZOMBIE) ||
+ (p->state == TASK_DEAD))
+ return 0;
+ return 1;
+}
/* Refrigerator is place where frozen processes are stored :-). */
void refrigerator(unsigned long flag)
@@ -71,8 +73,10 @@ int freeze_processes(void)
read_lock(&tasklist_lock);
do_each_thread(g, p) {
unsigned long flags;
- INTERESTING(p);
- if (p->flags & PF_FROZEN)
+ if (!freezeable(p))
+ continue;
+ if ((p->flags & PF_FROZEN) ||
+ (p->state == TASK_STOPPED))
continue;
/* FIXME: smp problem here: we may not access other process' flags
@@ -104,15 +108,18 @@ void thaw_processes(void)
printk( "Restarting tasks..." );
read_lock(&tasklist_lock);
do_each_thread(g, p) {
- INTERESTING(p);
-
- if (p->flags & PF_FROZEN) p->flags &= ~PF_FROZEN;
- else
+ if (!freezeable(p))
+ continue;
+ if (p->flags & PF_FROZEN) {
+ p->flags &= ~PF_FROZEN;
+ wake_up_process(p);
+ } else
printk(KERN_INFO " Strange, %s not stopped\n", p->comm );
wake_up_process(p);
} while_each_thread(g, p);
read_unlock(&tasklist_lock);
+ schedule();
printk( " done\n" );
MDELAY(500);
}