Messages in this thread Patch in this message | | | Date | Mon, 4 Aug 2003 17:58:40 -0700 (PDT) | From | Patrick Mochel <> | Subject | Re: [PM] Fix up refrigerator to work with ^Z-ed processes |
| |
> This makes refrigerator work with ^Z-ed processes (and not eat > disks). Thanks to (have to find out who, I should sleep and not be > splitting patches). [Hand edited, apply by hand; or there should be > script for recomputing @@ X,Y Z,T @@'s somewhere]. > > schedule() added makes processes start at exactly that point, making > printouts nicer.
This didn't apply, so in making the changes by hand, I took the liberty to rename interesting_process() to freezeable() to make it a bit easier to read. Revised patch below.
-pat
ChangeSet 1.1516, 2003/08/04 16:08:22-07:00, mochel@osdl.org
[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.
kernel/power/process.c | 35 +++++++++++++++++++++-------------- 1 files changed, 21 insertions(+), 14 deletions(-)
diff -Nru a/kernel/power/process.c b/kernel/power/process.c --- a/kernel/power/process.c Mon Aug 4 17:45:10 2003 +++ b/kernel/power/process.c Mon Aug 4 17:45:10 2003 @@ -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 @@ 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 @@ 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); } - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |