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)?
Well, I took a look.. and decided I'd like to find the place in kernel
where I can add try_to_freeze() and fix the TASK_STOPPED processes. I
hope such place exists.
Pavel
>
> Signed-off-by: Rafael J. Wysocki <[EMAIL PROTECTED]>
> ---
> 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;
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures)
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
-
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html