All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: suspend-devel@lists.sourceforge.net
Cc: Pavel Machek <pavel@suse.cz>, pm list <linux-pm@lists.osdl.org>,
	Nigel Cunningham <ncunningham@linuxmail.org>,
	Stephen Hemminger <shemminger@osdl.org>
Subject: Re: [PATCH -mm 1/2]: PM: Fix handling of stopped tasks
Date: Sun, 10 Dec 2006 01:27:36 +0100	[thread overview]
Message-ID: <200612100127.37288.rjw@sisk.pl> (raw)
In-Reply-To: <200612091635.33455.rjw@sisk.pl>

Hi,

On Saturday, 9 December 2006 16:35, Rafael J. Wysocki wrote:
> On Saturday, 9 December 2006 00:36, Pavel Machek wrote:
> > Hi!
> > 
> > > > > I wonder if we should start a test suite ;-).
> > > > > 
> > > > > > This means, however, that with this patch the behavior of a process (gdb)
> > > > > > after the resume may be different to its normal behavior, which is wrong.
> > > > > 
> > > > > Yep.
> > > 
> > > Okay, I think I know what to do so that it works.  The above symptoms are not
> > > present with the appended patch.
> > 
> > Looks good to me. Thanks for you work!
> 
> Well, there's still a race possible in there, if SIGCONT comes after we have
> forced the SIGSTOP and before we call signal_wake_up().
> 
> I think we should force the SIGSTOP and call signal_wake_up() without
> releasing the lock.  I'll try to do something along these lines later today.

I think something like the appended patch will do.

Greetings,
Rafael


Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
---
 include/linux/sched.h  |    1 +
 kernel/power/process.c |   15 ++++++++-------
 kernel/signal.c        |   16 +++++++++++++++-
 3 files changed, 24 insertions(+), 8 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-08 23:20:35.000000000 +0100
+++ linux-2.6.19-rc6-mm2/kernel/power/process.c	2006-12-10 00:37:24.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;
 }
@@ -61,9 +60,13 @@ static inline void freeze_process(struct
 	unsigned long flags;
 
 	if (!freezing(p)) {
-		freeze(p);
 		spin_lock_irqsave(&p->sighand->siglock, flags);
-		signal_wake_up(p, 0);
+		freeze(p);
+		if (p->state == TASK_STOPPED) {
+			force_sigstop_and_wake_up(p);
+		} else {
+			signal_wake_up(p, 0);
+		}
 		spin_unlock_irqrestore(&p->sighand->siglock, flags);
 	}
 }
@@ -103,9 +106,7 @@ static unsigned int try_to_freeze_tasks(
 			if (frozen(p))
 				continue;
 
-			if (p->state == TASK_TRACED &&
-			    (frozen(p->parent) ||
-			     p->parent->state == TASK_STOPPED)) {
+			if (p->state == TASK_TRACED && frozen(p->parent)) {
 				cancel_freezing(p);
 				continue;
 			}
Index: linux-2.6.19-rc6-mm2/kernel/signal.c
===================================================================
--- linux-2.6.19-rc6-mm2.orig/kernel/signal.c	2006-12-08 23:20:35.000000000 +0100
+++ linux-2.6.19-rc6-mm2/kernel/signal.c	2006-12-10 00:43:39.000000000 +0100
@@ -962,6 +962,18 @@ force_sig_specific(int sig, struct task_
 }
 
 /*
+ * Force a SIGSTOP and make the task wake up.
+ *
+ * This is needed for the freezing of stopped tasks, because we want them to
+ * enter the refrigerator and be stopped again immediately after leaving it.
+ */
+void force_sigstop_and_wake_up(struct task_struct *t)
+{
+	specific_send_sig_info(SIGSTOP, SEND_SIG_FORCED, t);
+	signal_wake_up(t, 1);
+}
+
+/*
  * Test if P wants to take SIG.  After we've checked all threads with this,
  * it's equivalent to finding no threads not blocking SIG.  Any threads not
  * blocking SIG were ruled out because they are not running and already
@@ -1829,7 +1841,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.
 	 */
Index: linux-2.6.19-rc6-mm2/include/linux/sched.h
===================================================================
--- linux-2.6.19-rc6-mm2.orig/include/linux/sched.h	2006-12-10 00:20:07.000000000 +0100
+++ linux-2.6.19-rc6-mm2/include/linux/sched.h	2006-12-10 00:42:44.000000000 +0100
@@ -1350,6 +1350,7 @@ extern int kill_pg_info(int, struct sigi
 extern void do_notify_parent(struct task_struct *, int);
 extern void force_sig(int, struct task_struct *);
 extern void force_sig_specific(int, struct task_struct *);
+extern void force_sigstop_and_wake_up(struct task_struct *t);
 extern int send_sig(int, struct task_struct *, int);
 extern void zap_other_threads(struct task_struct *p);
 extern int kill_pg(pid_t, int, int);

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV

  reply	other threads:[~2006-12-10  0:27 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         ` [Suspend-devel] " Rafael J. Wysocki
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 [this message]
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=200612100127.37288.rjw@sisk.pl \
    --to=rjw@sisk.pl \
    --cc=linux-pm@lists.osdl.org \
    --cc=ncunningham@linuxmail.org \
    --cc=pavel@suse.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.