All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: Pavel Machek <pavel@ucw.cz>
Cc: suspend-devel@lists.sourceforge.net,
	pm list <linux-pm@lists.osdl.org>,
	Stephen Hemminger <shemminger@osdl.org>
Subject: Re: [Suspend-devel] [PATCH -mm 1/2]: PM: Fix handling of stopped tasks
Date: Tue, 5 Dec 2006 22:42:26 +0100	[thread overview]
Message-ID: <200612052242.26915.rjw@sisk.pl> (raw)
In-Reply-To: <200612052226.10540.rjw@sisk.pl>

On Tuesday, 5 December 2006 22:26, Rafael J. Wysocki wrote:
> On Tuesday, 5 December 2006 22:03, Rafael J. Wysocki wrote:
> > Okay, I have replaced my [1/2] with the patch below ...
> > 
> > On Tuesday, 5 December 2006 11:34, Pavel Machek wrote:
<--snip-->
> 
> Well, now the task that was stopped before the suspend doesn't go to the
> refrigerator when it's received the continuation signal after the resume.
> Good, but is it sufficient?

Well, almost.

Namely, if you suspend with a stopped vi and you look at the dmesg output
after the resume, there will be something like this:

Restarting tasks ... <4> Strange, vi not stopped

which means that thaw_tasks() is confused by the lurking stopped task.  We can
fix that by checking if the task in question is not stopped before printing
the message in thaw_tasks() and we get this:

 kernel/power/process.c |   21 ++++++++++++++++++---
 kernel/signal.c        |    4 +++-
 2 files changed, 21 insertions(+), 4 deletions(-)

Index: linux-2.6.19-rc6-mm2/kernel/power/process.c
===================================================================
--- linux-2.6.19-rc6-mm2.orig/kernel/power/process.c	2006-12-05 21:10:00.000000000 +0100
+++ linux-2.6.19-rc6-mm2/kernel/power/process.c	2006-12-05 22:44:45.000000000 +0100
@@ -28,8 +28,7 @@ static inline int freezeable(struct task
 	if ((p == current) || 
 	    (p->flags & PF_NOFREEZE) ||
 	    (p->exit_state == EXIT_ZOMBIE) ||
-	    (p->exit_state == EXIT_DEAD) ||
-	    (p->state == TASK_STOPPED))
+	    (p->exit_state == EXIT_DEAD))
 		return 0;
 	return 1;
 }
@@ -103,6 +102,9 @@ static unsigned int try_to_freeze_tasks(
 			if (frozen(p))
 				continue;
 
+			if (p->state == TASK_STOPPED && freezing(p))
+				continue;
+
 			if (p->state == TASK_TRACED &&
 			    (frozen(p->parent) ||
 			     p->parent->state == TASK_STOPPED)) {
@@ -185,6 +187,18 @@ int freeze_processes(void)
 	return 0;
 }
 
+static inline void release_stopped_tasks(void)
+{
+	struct task_struct *g, *p;
+
+	read_lock(&tasklist_lock);
+	do_each_thread(g, p) {
+		if (p->state == TASK_STOPPED && freezing(p))
+			cancel_freezing(p);
+	} while_each_thread(g, p);
+	read_unlock(&tasklist_lock);
+}
+
 static void thaw_tasks(int thaw_user_space)
 {
 	struct task_struct *g, *p;
@@ -197,7 +211,7 @@ static void thaw_tasks(int thaw_user_spa
 		if (is_user_space(p) == !thaw_user_space)
 			continue;
 
-		if (!thaw_process(p))
+		if (!thaw_process(p) && p->state != TASK_STOPPED)
 			printk(KERN_WARNING " Strange, %s not stopped\n",
 				p->comm );
 	} while_each_thread(g, p);
@@ -207,6 +221,7 @@ static void thaw_tasks(int thaw_user_spa
 void thaw_processes(void)
 {
 	printk("Restarting tasks ... ");
+	release_stopped_tasks();
 	thaw_tasks(FREEZER_KERNEL_THREADS);
 	thaw_tasks(FREEZER_USER_SPACE);
 	schedule();
Index: linux-2.6.19-rc6-mm2/kernel/signal.c
===================================================================
--- linux-2.6.19-rc6-mm2.orig/kernel/signal.c	2006-12-05 21:10:00.000000000 +0100
+++ linux-2.6.19-rc6-mm2/kernel/signal.c	2006-12-05 21:11:31.000000000 +0100
@@ -1829,7 +1829,9 @@ finish_stop(int stop_count)
 		read_unlock(&tasklist_lock);
 	}
 
-	schedule();
+	do {
+		schedule();
+	} while (try_to_freeze());
 	/*
 	 * Now we don't run again until continued.
 	 */

But now it looks almost like my [1/2], doesn't it? ;-)

Greetings,
Rafael


-- 
If you don't have the time to read,
you don't have the time or the tools to write.
		- Stephen King

  reply	other threads:[~2006-12-05 21:42 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-12-03 22:18 [PATCH -mm 0/2]: SMP-safe freezer Rafael J. Wysocki
2006-12-03 22:50 ` [PATCH -mm 1/2]: PM: Fix handling of stopped tasks Rafael J. Wysocki
2006-12-05 10:25   ` Pavel Machek
2006-12-05 10:34   ` Pavel Machek
2006-12-05 11:06     ` Rafael J. Wysocki
2006-12-05 14:13       ` Pavel Machek
2006-12-05 14:22         ` Rafael J. Wysocki
2006-12-05 11:24     ` Pavel Machek
2006-12-05 11:38       ` Rafael J. Wysocki
2006-12-05 14:12         ` Pavel Machek
2006-12-05 14:26           ` Rafael J. Wysocki
2006-12-05 14:33             ` Rafael J. Wysocki
2006-12-05 15:27             ` Pavel Machek
2006-12-05 17:22               ` Rafael J. Wysocki
2006-12-05 21:03     ` Rafael J. Wysocki
2006-12-05 21:26       ` Rafael J. Wysocki
2006-12-05 21:42         ` Rafael J. Wysocki [this message]
2006-12-05 22:19       ` Pavel Machek
2006-12-05 22:18         ` Rafael J. Wysocki
2006-12-06  0:07           ` [linux-pm] " Nigel Cunningham
2006-12-05 22:36       ` Pavel Machek
2006-12-05 22:45         ` Rafael J. Wysocki
2006-12-05 23:08           ` Rafael J. Wysocki
2006-12-05 23:45             ` Pavel Machek
2006-12-06  0:02               ` [Suspend-devel] " Nigel Cunningham
2006-12-06 23:13               ` Rafael J. Wysocki
2006-12-08 11:21                 ` Pavel Machek
2006-12-08 11:49                   ` Rafael J. Wysocki
2006-12-08 13:05                     ` Rafael J. Wysocki
2006-12-08 22:07                     ` Rafael J. Wysocki
2006-12-08 23:36                       ` Pavel Machek
2006-12-09 15:35                         ` Rafael J. Wysocki
2006-12-10  0:27                           ` Rafael J. Wysocki
2006-12-10 10:45                             ` Rafael J. Wysocki
2006-12-10 20:00                               ` Pavel Machek
2006-12-10 11:26                     ` Rafael J. Wysocki
2006-12-03 23:10 ` [PATCH -mm 2/2]: PM: SMP-safe freezer Rafael J. Wysocki
2006-12-04 10:30   ` Pavel Machek
2006-12-04 14:03     ` Rafael J. Wysocki
2006-12-04 19:44       ` Pavel Machek
2006-12-04 19:56         ` Rafael J. Wysocki
2006-12-05  5:43         ` [linux-pm] " David Brownell
2006-12-05 11:14           ` [Suspend-devel] " Rafael J. Wysocki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200612052242.26915.rjw@sisk.pl \
    --to=rjw@sisk.pl \
    --cc=linux-pm@lists.osdl.org \
    --cc=pavel@ucw.cz \
    --cc=shemminger@osdl.org \
    --cc=suspend-devel@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.