lkml.org 
[lkml]   [2010]   [Apr]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3/8] PM: suspend_block: Abort task freezing if a suspend_blocker is active.
    Date
    If a suspend_blocker is active, suspend will fail anyway. Since
    try_to_freeze_tasks can take up to 20 seconds to complete or fail, aborting
    as soon as someone blocks suspend (e.g. from an interrupt handler) improves
    the worst case wakeup latency.

    On an older kernel where task freezing could fail for processes attached
    to a debugger, this fixed a problem where the device sometimes hung for
    20 seconds before the screen turned on.

    Signed-off-by: Arve Hjønnevåg <arve@android.com>
    ---
    kernel/power/process.c | 12 ++++++++++--
    1 files changed, 10 insertions(+), 2 deletions(-)

    diff --git a/kernel/power/process.c b/kernel/power/process.c
    index 71ae290..d8ebd50 100644
    --- a/kernel/power/process.c
    +++ b/kernel/power/process.c
    @@ -15,6 +15,7 @@
    #include <linux/syscalls.h>
    #include <linux/freezer.h>
    #include <linux/delay.h>
    +#include <linux/suspend_blocker.h>

    /*
    * Timeout for stopping processes
    @@ -38,6 +39,7 @@ static int try_to_freeze_tasks(bool sig_only)
    struct timeval start, end;
    u64 elapsed_csecs64;
    unsigned int elapsed_csecs;
    + bool wakeup = false;

    do_gettimeofday(&start);

    @@ -63,6 +65,10 @@ static int try_to_freeze_tasks(bool sig_only)
    todo++;
    } while_each_thread(g, p);
    read_unlock(&tasklist_lock);
    + if (todo && suspend_is_blocked()) {
    + wakeup = true;
    + break;
    + }
    if (!todo || time_after(jiffies, end_time))
    break;

    @@ -85,13 +91,15 @@ static int try_to_freeze_tasks(bool sig_only)
    * but it cleans up leftover PF_FREEZE requests.
    */
    printk("\n");
    - printk(KERN_ERR "Freezing of tasks failed after %d.%02d seconds "
    + printk(KERN_ERR "Freezing of tasks %s after %d.%02d seconds "
    "(%d tasks refusing to freeze):\n",
    + wakeup ? "aborted" : "failed",
    elapsed_csecs / 100, elapsed_csecs % 100, todo);
    read_lock(&tasklist_lock);
    do_each_thread(g, p) {
    task_lock(p);
    - if (freezing(p) && !freezer_should_skip(p))
    + if (freezing(p) && !freezer_should_skip(p)
    + && elapsed_csecs > 100)
    sched_show_task(p);
    cancel_freezing(p);
    task_unlock(p);
    --
    1.6.5.1
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2010-05-01 00:43    [W:4.140 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site