Re: [PM] Fix up refrigerator to work with ^Z-ed processes

From: Patrick Mochel (mochel@osdl.org)
Date: Mon Aug 04 2003 - 19:58:40 EST


> 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/



This archive was generated by hypermail 2b29 : Thu Aug 07 2003 - 22:00:26 EST