lkml.org 
[lkml]   [2003]   [Aug]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [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/

\
 
 \ /
  Last update: 2005-03-22 13:47    [W:0.075 / U:0.180 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site