lkml.org 
[lkml]   [2009]   [Dec]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRe: [PATCH] uswsusp: automatically free the in-memory image once s2disk has finished with it
    Date
    On Wednesday 02 December 2009, Alan Jenkins wrote:
    > The original in-kernel suspend (swsusp) frees the in-memory hibernation
    > image before powering off the machine. s2disk doesn't, so there is
    > _much_ less free memory when it tries to power off.
    >
    > This is a gratuitous difference. The userspace suspend interface
    > /dev/snapshot only allows the hibernation image to be read once.
    > Once the s2disk program has read the last page, we can free the entire
    > image.
    >
    > This avoids a hang after writing the hibernation image which was
    > triggered by commit 5f8dcc21211a3d4e3a7a5ca366b469fb88117f61
    > "page-allocator: split per-cpu list into one-list-per-migrate-type":
    >
    > [top of trace lost due to screen height]
    > ? shrink_zone
    > ? try_to_free_pages
    > ? isolate_pages_global
    > ? __alloc_pages_nodemask
    > ? kthread
    > ? __get_free_pages
    > ? copy_process
    > ? kthread
    > ? do_fork
    > ...
    >
    > INFO: task s2disk:2036 blocked for more than 120 seconds
    > ...
    > Call Trace:
    > ...
    > ? wait_for_common
    > ? default_wake_function
    > ? kthread_create
    > ? worker_thread
    > ? create_workqueue_thread
    > ? worker_thread
    > ? __create_workqueue_key
    > ? stop_machine_create
    > ? disable_nonboot_cpus
    > ? hibernation_platform_enter
    > ? snapshot_ioctl
    > ...
    > ? sys_ioctl
    > ...
    >
    > Signed-off-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk>

    Thanks for tracking this, great job!

    I'm going to push this patch to Linus in the next batch (before 2.6.32 if I
    manage to).

    Best,
    Rafael


    > ---
    > kernel/power/user.c | 4 ++++
    > 1 files changed, 4 insertions(+), 0 deletions(-)
    >
    > diff --git a/kernel/power/user.c b/kernel/power/user.c
    > index bf0014d..94d0210 100644
    > --- a/kernel/power/user.c
    > +++ b/kernel/power/user.c
    > @@ -165,6 +165,10 @@ static ssize_t snapshot_read(struct file *filp, char __user *buf,
    > res = -EFAULT;
    > else
    > *offp = data->handle.offset;
    > + } else {
    > + swsusp_free();
    > + memset(&data->handle, 0, sizeof(struct snapshot_handle));
    > + data->ready = 0;
    > }
    >
    > Unlock:
    >



    \
     
     \ /
      Last update: 2009-12-02 22:49    [W:0.039 / U:1.292 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site