Skip to contentSkip to conversation

Fix up refrigerator to work with ^Z-ed processes

PM Pavel Machek 2 participants 3 messages Jul 26, 2003 – Aug 5, 2003

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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
Index: linux/kernel/suspend.c
===================================================================
@@ 1,-1 1,-1 @@ 
 /*
  * Refrigerator and related stuff
  */
 
-#define INTERESTING(p) \
@@ -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?]

#1 lore raw
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
diff -Nru 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 @@
 		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);
 }
#2 lore raw

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() to freezeable() 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?]