• Oleg Nesterov's avatar
    coredump: only SIGKILL should interrupt the coredumping task · 403bad72
    Oleg Nesterov authored
    There are 2 well known and ancient problems with coredump/signals, and a
    lot of related bug reports:
    
    - do_coredump() clears TIF_SIGPENDING but of course this can't help
      if, say, SIGCHLD comes after that.
    
      In this case the coredump can fail unexpectedly. See for example
      wait_for_dump_helper()->signal_pending() check but there are other
      reasons.
    
    - At the same time, dumping a huge core on the slow media can take a
      lot of time/resources and there is no way to kill the coredumping
      task reliably. In particular this is not oom_kill-friendly.
    
    This patch tries to fix the 1st problem, and makes the preparation for the
    next changes.
    
    We add the new SIGNAL_GROUP_COREDUMP flag set by zap_threads() to indicate
    that this process dumps the core.  prepare_signal() checks this flag and
    nacks any signal except SIGKILL.
    
    Note that this check tries to be conservative, in the long term we should
    probably treat the SIGNAL_GROUP_EXIT case equally but this needs more
    discussion.  See marc.info/?l=linux-kernel&m=120508897917439
    
    Notes:
    	- recalc_sigpending() doesn't check SIGNAL_GROUP_COREDUMP.
    	  The patch assumes that dump_write/etc paths should never
    	  call it, but we can change it as well.
    
    	- There is another source of TIF_SIGPENDING, freezer. This
    	  will be addressed separately.
    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>
    403bad72
signal.c 94.9 KB