• Roland McGrath's avatar
    freezer vs stopped or traced · 13b1c3d4
    Roland McGrath authored
    This changes the "freezer" code used by suspend/hibernate in its treatment
    of tasks in TASK_STOPPED (job control stop) and TASK_TRACED (ptrace) states.
    
    As I understand it, the intent of the "freezer" is to hold all tasks
    from doing anything significant.  For this purpose, TASK_STOPPED and
    TASK_TRACED are "frozen enough".  It's possible the tasks might resume
    from ptrace calls (if the tracer were unfrozen) or from signals
    (including ones that could come via timer interrupts, etc).  But this
    doesn't matter as long as they quickly block again while "freezing" is
    in effect.  Some minor adjustments to the signal.c code make sure that
    try_to_freeze() very shortly follows all wakeups from both kinds of
    stop.  This lets the freezer code safely leave stopped tasks unmolested.
    
    Changing this fixes the longstanding bug of seeing after resuming from
    suspend/hibernate your shell report "[1] Stopped" and the like for all
    your jobs stopped by ^Z et al, as if you had freshly fg'd and ^Z'd them.
    It also removes from the freezer the arcane special case treatment for
    ptrace'd tasks, which relied on intimate knowledge of ptrace internals.
    Signed-off-by: default avatarRoland McGrath <roland@redhat.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    13b1c3d4
signal.c 65.4 KB