• Rafael J. Wysocki's avatar
    PM: Allow drivers to allocate memory from .prepare() callbacks safely · 91e7c75b
    Rafael J. Wysocki authored
    If device drivers allocate substantial amounts of memory (above 1 MB)
    in their hibernate .freeze() callbacks (or in their legacy suspend
    callbcks during hibernation), the subsequent creation of hibernate
    image may fail due to the lack of memory.  This is the case, because
    the drivers' .freeze() callbacks are executed after the hibernate
    memory preallocation has been carried out and the preallocated amount
    of memory may be too small to cover the new driver allocations.
    Unfortunately, the drivers' .prepare() callbacks also are executed
    after the hibernate memory preallocation has completed, so they are
    not suitable for allocating additional memory either.  Thus the only
    way a driver can safely allocate memory during hibernation is to use
    a hibernate/suspend notifier.  However, the notifiers are called
    before the freezing of user space and the drivers wanting to use them
    for allocating additional memory may not know how much memory needs
    to be allocated at that point.
    
    To let device drivers overcome this difficulty rework the hibernation
    sequence so that the memory preallocation is carried out after the
    drivers' .prepare() callbacks have been executed, so that the
    .prepare() callbacks can be used for allocating additional memory
    to be used by the drivers' .freeze() callbacks.  Update documentation
    to match the new behavior of the code.
    Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
    91e7c75b
main.c 26.7 KB