• Oleg Nesterov's avatar
    coredump: ensure that SIGKILL always kills the dumping thread · 6cd8f0ac
    Oleg Nesterov authored
    prepare_signal() blesses SIGKILL sent to the dumping process but this
    signal can be "lost" anyway.  The problems is, complete_signal() sees
    SIGNAL_GROUP_EXIT and skips the "kill them all" logic.  And even if the
    dumping process is single-threaded (so the target is always "correct"),
    the group-wide SIGKILL is not recorded in task->pending and thus
    __fatal_signal_pending() won't be true.  A multi-threaded case has even
    more problems.
    
    And even ignoring all technical details, SIGNAL_GROUP_EXIT doesn't look
    right to me.  This coredumping process is not exiting yet, it can do a lot
    of work dumping the core.
    
    With this patch the dumping process doesn't have SIGNAL_GROUP_EXIT, we set
    signal->group_exit_task instead.  This makes signal_group_exit() true and
    thus this should equally close the races with exit/exec/stop but allows to
    kill the dumping thread reliably.
    
    Notes:
    	- It is not clear what should we do with ->group_exit_code
    	  if the dumper was killed, see the next change.
    
    	- we need more (hopefully straightforward) changes to ensure
    	  that SIGKILL actually interrupts the coredump. Basically we
    	  need to check __fatal_signal_pending() in dump_write() and
    	  dump_seek().
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Tested-by: default avatarMandeep Singh Baines <msb@chromium.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Neil Horman <nhorman@redhat.com>
    Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
    Cc: Roland McGrath <roland@hack.frob.com>
    Cc: Tejun Heo <tj@kernel.org>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    6cd8f0ac
coredump.c 16.8 KB