• Colin Cross's avatar
    freezer: set PF_SUSPEND_TASK flag on tasks that call freeze_processes · 2b44c4db
    Colin Cross authored
    Calling freeze_processes sets a global flag that will cause any
    process that calls try_to_freeze to enter the refrigerator.  It
    skips sending a signal to the current task, but if the current
    task ever hits try_to_freeze, all threads will be frozen and the
    system will deadlock.
    Set a new flag, PF_SUSPEND_TASK, on the task that calls
    freeze_processes.  The flag notifies the freezer that the thread
    is involved in suspend and should not be frozen.  Also add a
    WARN_ON in thaw_processes if the caller does not have the
    PF_SUSPEND_TASK flag set to catch if a different task calls
    thaw_processes than the one that called freeze_processes, leaving
    a task with PF_SUSPEND_TASK permanently set on it.
    Threads that spawn off a task with PF_SUSPEND_TASK set (which
    swsusp does) will also have PF_SUSPEND_TASK set, preventing them
    from freezing while they are helping with suspend, but they need
    to be dead by the time suspend is triggered, otherwise they may
    run when userspace is expected to be frozen.  Add a WARN_ON in
    thaw_processes if more than one thread has the PF_SUSPEND_TASK
    flag set.
    Reported-and-tested-by: default avatarMichael Leun <lkml20130126@newton.leun.net>
    Signed-off-by: default avatarColin Cross <ccross@android.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
freezer.c 4.45 KB