From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: Pavel Machek <pavel@ucw.cz>
Cc: Linus Torvalds <torvalds@osdl.org>, Len Brown <lenb@kernel.org>,
linux-pm@lists.osdl.org, Stephen Hemminger <shemminger@osdl.org>,
Greg KH <greg@kroah.com>, Andrew Morton <akpm@osdl.org>,
linux-acpi@vger.kernel.org, linux-pm@osdl.org
Subject: Re: [linux-pm] [RFC] ACPI vs device ordering on resume
Date: Fri, 1 Dec 2006 11:33:11 +0100 [thread overview]
Message-ID: <200612011133.12332.rjw@sisk.pl> (raw)
In-Reply-To: <20061201093301.GA1842@elf.ucw.cz>
Hi,
On Friday, 1 December 2006 10:33, Pavel Machek wrote:
> Hi!
>
> > > So it looks like we need this sequence:
> > >
> > > enable_nonboot_cpus() /* INIT */
> > > finish() /* _WAK */
> > > device_resume()
> >
> > Can somebody remind me about this immediately after 2.6.19?
>
> Remind. But note that freezer is not yet SMP safe... Rafael is working
> on that.
Yup.
BTW, have you looked at the last version of the patch for the handling of
stopped tasks (appended just in case, full discussion at:
http://lists.osdl.org/pipermail/linux-pm/2006-November/004214.html)?
Rafael
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
---
kernel/power/process.c | 36 ++++++++++++++++++++++++++++++------
kernel/signal.c | 2 +-
2 files changed, 31 insertions(+), 7 deletions(-)
Index: linux-2.6.19-rc6-mm2/kernel/power/process.c
===================================================================
--- linux-2.6.19-rc6-mm2.orig/kernel/power/process.c
+++ linux-2.6.19-rc6-mm2/kernel/power/process.c
@@ -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;
}
@@ -81,6 +80,11 @@ static void cancel_freezing(struct task_
}
}
+static inline int stopped_and_freezing(struct task_struct *p)
+{
+ return p->state == TASK_STOPPED && freezing(p);
+}
+
static inline int is_user_space(struct task_struct *p)
{
return p->mm && !(p->flags & PF_BORROWED_MM);
@@ -103,9 +107,11 @@ 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 (stopped_and_freezing(p))
+ continue;
+
+ if (p->state == TASK_TRACED && (frozen(p->parent) ||
+ stopped_and_freezing(p->parent))) {
cancel_freezing(p);
continue;
}
@@ -149,7 +155,8 @@ static unsigned int try_to_freeze_tasks(
if (is_user_space(p) == !freeze_user_space)
continue;
- if (freezeable(p) && !frozen(p))
+ if (freezeable(p) && !frozen(p) &&
+ p->state != TASK_STOPPED && p->state != TASK_TRACED)
printk(KERN_ERR " %s\n", p->comm);
cancel_freezing(p);
@@ -185,6 +192,18 @@ int freeze_processes(void)
return 0;
}
+static void release_stopped_tasks(void)
+{
+ struct task_struct *g, *p;
+
+ read_lock(&tasklist_lock);
+ do_each_thread(g, p) {
+ if (stopped_and_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,6 +216,10 @@ static void thaw_tasks(int thaw_user_spa
if (is_user_space(p) == !thaw_user_space)
continue;
+ if (!frozen(p) &&
+ (p->state == TASK_STOPPED || p->state == TASK_TRACED))
+ continue;
+
if (!thaw_process(p))
printk(KERN_WARNING " Strange, %s not stopped\n",
p->comm );
@@ -207,6 +230,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
+++ linux-2.6.19-rc6-mm2/kernel/signal.c
@@ -1937,9 +1937,9 @@ int get_signal_to_deliver(siginfo_t *inf
sigset_t *mask = ¤t->blocked;
int signr = 0;
+relock:
try_to_freeze();
-relock:
spin_lock_irq(¤t->sighand->siglock);
for (;;) {
struct k_sigaction *ka;
next prev parent reply other threads:[~2006-12-01 10:33 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-11-14 23:30 [RFC] ACPI vs device ordering on resume Stephen Hemminger
2006-11-14 23:59 ` Linus Torvalds
2006-11-15 7:03 ` [linux-pm] " Len Brown
2006-11-15 9:32 ` Rafael J. Wysocki
2006-11-15 16:47 ` Linus Torvalds
2006-12-01 9:33 ` Pavel Machek
2006-12-01 10:33 ` Rafael J. Wysocki [this message]
2006-12-01 10:57 ` Pavel Machek
2006-12-01 11:31 ` Rafael J. Wysocki
2006-12-01 16:12 ` Linus Torvalds
2006-12-01 17:45 ` Alexey Starikovskiy
2006-12-01 18:40 ` Stephen Hemminger
2006-12-01 18:42 ` Alexey Starikovskiy
2006-12-01 1:48 ` Stephen Hemminger
2006-12-01 10:25 ` 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=200612011133.12332.rjw@sisk.pl \
--to=rjw@sisk.pl \
--cc=akpm@osdl.org \
--cc=greg@kroah.com \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-pm@lists.osdl.org \
--cc=linux-pm@osdl.org \
--cc=pavel@ucw.cz \
--cc=shemminger@osdl.org \
--cc=torvalds@osdl.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox