• Paul E. McKenney's avatar
    exit: Sleep at TASK_IDLE when waiting for application core dump · b8e75312
    Paul E. McKenney authored
    Currently, the coredump_task_exit() function sets the task state
    to TASK_UNINTERRUPTIBLE|TASK_FREEZABLE, which usually works well.
    But a combination of large memory and slow (and/or highly contended)
    mass storage can cause application core dumps to take more than
    two minutes, which can cause check_hung_task(), which is invoked by
    check_hung_uninterruptible_tasks(), to produce task-blocked splats.
    There does not seem to be any reasonable benefit to getting these splats.
    
    Furthermore, as Oleg Nesterov points out, TASK_UNINTERRUPTIBLE could
    be misleading because the task sleeping in coredump_task_exit() really
    is killable, albeit indirectly.  See the check of signal->core_state
    in prepare_signal() and the check of fatal_signal_pending()
    in dump_interrupted(), which bypass the normal unkillability of
    TASK_UNINTERRUPTIBLE, resulting in coredump_finish() invoking
    wake_up_process() on any threads sleeping in coredump_task_exit().
    
    Therefore, change that TASK_UNINTERRUPTIBLE to TASK_IDLE.
    Reported-by: default avatarAnhad Jai Singh <ffledgling@meta.com>
    Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
    Acked-by: default avatarOleg Nesterov <oleg@redhat.com>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: Christian Brauner <brauner@kernel.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>
    Cc: Chris Mason <clm@fb.com>
    Cc: Rik van Riel <riel@surriel.com>
    b8e75312
exit.c 47.4 KB