Re: [PATCH 09/13] PM: wakelock: Abort task freezing if a wake lock is held.

mark gross
2009-02-06T00:35:52Z

On Wed, Feb 04, 2009 at 06:50:22PM -0800, Arve Hjønnevåg wrote:
> Avoids a problem where the device sometimes hangs for 20 seconds
> before the screen is turned on.
>

wouldn't it be better to find out what freeze_task call is blocking and
fix that?

> Signed-off-by: Arve Hjønnevåg <arve@android.com>
> ---
> kernel/power/process.c | 22 +++++++++++++++++-----
> 1 files changed, 17 insertions(+), 5 deletions(-)
>
> diff --git a/kernel/power/process.c b/kernel/power/process.c
> index ca63401..8388d01 100644
> --- a/kernel/power/process.c
> +++ b/kernel/power/process.c
> @@ -13,6 +13,7 @@
> #include <linux/module.h>
> #include <linux/syscalls.h>
> #include <linux/freezer.h>
> +#include <linux/wakelock.h>
>
> /*
> * Timeout for stopping processes
> @@ -36,6 +37,7 @@ static int try_to_freeze_tasks(bool sig_only)
> struct timeval start, end;
> u64 elapsed_csecs64;
> unsigned int elapsed_csecs;
> + unsigned int wakeup = 0;
>
> do_gettimeofday(&start);
>
> @@ -62,6 +64,10 @@ static int try_to_freeze_tasks(bool sig_only)
> } while_each_thread(g, p);
> read_unlock(&tasklist_lock);
> yield(); /* Yield is okay here */
> + if (todo && has_wake_lock(WAKE_LOCK_SUSPEND)) {
> + wakeup = 1;
> + break;
> + }

this effectivey give the freezing algorithm one shot at putting threads
into a suspend safe state. arn't you risking bugs on resume by doing
this?

> if (time_after(jiffies, end_time))
> break;
> } while (todo);
> @@ -77,11 +83,17 @@ static int try_to_freeze_tasks(bool sig_only)
> * and caller must call thaw_processes() if something fails),
> * but it cleans up leftover PF_FREEZE requests.
> */
> - printk("\n");
> - printk(KERN_ERR "Freezing of tasks failed after %d.%02d seconds "
> - "(%d tasks refusing to freeze):\n",
> - elapsed_csecs / 100, elapsed_csecs % 100, todo);
> - show_state();
> + if (wakeup) {
> + printk("\n");
> + printk(KERN_ERR "Freezing of %s aborted\n",
> + sig_only ? "user space " : "tasks ");
> + } else {
> + printk("\n");
> + printk(KERN_ERR "Freezing of tasks failed after %d.%02d seconds "
> + "(%d tasks refusing to freeze):\n",
> + elapsed_csecs / 100, elapsed_csecs % 100, todo);
> + show_state();
> + }
> read_lock(&tasklist_lock);
> do_each_thread(g, p) {
> task_lock(p);
> --
> 1.6.1
>
> _______________________________________________
> linux-pm mailing list
> linux-pm@lists.linux-foundation.org
> https://lists.linux-foundation.org/mailman/listinfo/linux-pm