lkml.org 
[lkml]   [2011]   [Sep]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 2/6] freezer: set PF_NOFREEZE on a dying task right before TASK_DEAD setting bug in freezer_change_state()
    Date
    3fb45733df "freezer: make exiting tasks properly unfreezable" removed
    clear_freeze_flag() from exit path and set PF_NOFREEZE right after
    PTRACE_EVENT_EXIT; however, Oleg pointed out that following exit paths
    may cause interaction with device drivers after PM freezer consider
    the system frozen.

    There's no try_to_freeze() call in the exit path and the only
    necessary guarantee is that freezer doesn't hang waiting for zombies.
    Set PF_NOFREEZE right before setting tsk->state to TASK_DEAD instead.

    Signed-off-by: Tejun Heo <tj@kernel.org>
    Reported-by: Oleg Nesterov <oleg@redhat.com>
    Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
    ---
    kernel/exit.c | 10 ++++------
    1 files changed, 4 insertions(+), 6 deletions(-)

    diff --git a/kernel/exit.c b/kernel/exit.c
    index ac58259..7b6c4fa 100644
    --- a/kernel/exit.c
    +++ b/kernel/exit.c
    @@ -913,12 +913,6 @@ NORET_TYPE void do_exit(long code)

    ptrace_event(PTRACE_EVENT_EXIT, code);

    - /*
    - * With ptrace notification done, there's no point in freezing from
    - * here on. Disallow freezing.
    - */
    - current->flags |= PF_NOFREEZE;
    -
    validate_creds_for_do_exit(tsk);

    /*
    @@ -1044,6 +1038,10 @@ NORET_TYPE void do_exit(long code)

    preempt_disable();
    exit_rcu();
    +
    + /* this task is now dead and freezer should ignore it */
    + current->flags |= PF_NOFREEZE;
    +
    /* causes final put_task_struct in finish_task_switch(). */
    tsk->state = TASK_DEAD;
    schedule();
    --
    1.7.6


    \
     
     \ /
      Last update: 2011-09-02 20:31    [W:0.029 / U:152.028 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site