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 <rjw@xxxxxxx> > --- > 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html