Re: Software suspend testing in 2.6.0-test1

Pavel Machek
2003-07-21T12:47:12Z

Hi!

> > Thanks for a report. If it came with a patch it would be better
> > ;-). I'll take a look.
>
> Here is a patch to make software suspend correctly handle stopped
> processes. It should apply cleanly on top of the patch you sent to
> Linus to decouple SOFTWARE_SUSPEND and ACPI_SLEEP.
>
> @@ -164,14 +164,18 @@
> * Refrigerator and related stuff
> */
>
> -#define INTERESTING(p) > - /* We don't want to touch kernel_threads..*/ > - if (p->flags & PF_IOTHREAD) > - continue; > - if (p == current) > - continue; > - if (p->state == TASK_ZOMBIE) > - continue;
> +/* 0 = Ignore this process when freezing/thawing, 1 = freeze/thaw this process */
> +static inline int interesting_process(struct task_struct *p)
> +{
> + if (p->flags & PF_IOTHREAD)
> + return 0;
> + if (p == current)
> + return 0;
> + if ((p->state == TASK_ZOMBIE) || (p->state == TASK_DEAD))
> + return 0;
> +
> + return 1;
> +}
>

Simple cleanup, okay.

> @@ -214,9 +218,12 @@
> read_lock(&tasklist_lock);
> do_each_thread(g, p) {
> unsigned long flags;
> - INTERESTING(p);
> + if (!interesting_process(p))
> + continue;
> if (p->flags & PF_FROZEN)
> continue;
> + if (p->state == TASK_STOPPED)
> + continue;
>
> /* FIXME: smp problem here: we may not access other process' flags
> without locking */

No need to handle TASK_STOPPED tasks, as they are "frozen" already. Ok.

> read_lock(&tasklist_lock);
> do_each_thread(g, p) {
> - INTERESTING(p);
> -
> - if (p->flags & PF_FROZEN) p->flags &= ~PF_FROZEN;
> - else
> - printk(KERN_INFO " Strange, %s not stopped\n", p->comm );
> - wake_up_process(p);
> + if (!interesting_process(p))
> + continue;
> +
> + p->flags &= ~PF_FREEZE;
> + if (p->flags & PF_FROZEN) {
> + p->flags &= ~PF_FROZEN;
> + wake_up_process(p);
> + } else
> +
But why do you touch PF_FROZEN here? Refrigerator should do that.
And wake_up_process should not be needed...
If it is in refrigerator, it polls PF_FREEZE...

--
Pavel
Written on sharp zaurus, because my Velo1 broke. If you have Velo you don't need...