Fix up refrigerator to work with ^Z-ed processes
Subsystems (2)
Hi!
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.
Pavel
kernel/suspend.c +12 -8
@@ -212,9 +218,12 @@read_lock (&tasklist_lock); do_each_thread(g, p) {unsigned long flags; -INTERESTING (p); +if (!interesting_process (p)) +continue ;if (p->flags &PF_FROZEN )continue ; +if (p->state ==TASK_STOPPED ) +continue ;/* FIXME: smp problem here: we may not access other process' flags without locking */
@@ -245,19 +254,56 @@printk ("Restarting tasks..." );read_lock (&tasklist_lock); do_each_thread(g, p) { -INTERESTING (p); - -if (p->flags &PF_FROZEN ) p->flags &= ~PF_FROZEN ; -else -printk (KERN_INFO " Strange, %s not stopped\n" , p->comm ); -wake_up_process (p); +if (!interesting_process (p)) +continue ; +if (p->flags &PF_FROZEN ) { + p->flags &= ~PF_FROZEN ; +wake_up_process (p); + }else +PRINTK (KERN_INFO " Strange, %s not frozen\n" , p->comm ); }while_each_thread (g, p);read_unlock (&tasklist_lock); +schedule ();printk (" done\n" );MDELAY (500 ); } --
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]
Quoted 9 lines
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, [email protected]
[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(-)
kernel/power/process.c +21 -14
@@ -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 ); }
Hi!
Quoted 11 lines
Quoted 7 lines
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()tofreezeable()to make it a bit easier to read. Revised patch below.
Yes, that's better name, patch looks good. Thanks,
Pavel
Signature · 2 lines
When do you have a heart between your knees? [Johanka's followup: and *two* hearts?]