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@xxxxxxxxxxx> > --- > 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@xxxxxxxxxxxxxxxxxxxxxxxxxx > https://lists.linux-foundation.org/mailman/listinfo/linux-pm _______________________________________________ linux-pm mailing list linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/linux-pm