• Oleg Nesterov's avatar
    [PATCH] do_coredump() should reset group_stop_count earlier · bb6f6dba
    Oleg Nesterov authored
    __group_complete_signal() sets ->group_stop_count in sig_kernel_coredump()
    path and marks the target thread as ->group_exit_task.  So any thread
    except group_exit_task will go to handle_group_stop()->finish_stop().
    However, when group_exit_task actually starts do_coredump(), it sets
    SIGNAL_GROUP_EXIT, but does not reset ->group_stop_count while killing
    other threads.  If we have not yet stopped threads in the same thread
    group, they all will spin in kernel mode until group_exit_task sends them
    SIGKILL, because ->group_stop_count > 0 means:
    	recalc_sigpending_tsk() never clears TIF_SIGPENDING
    	get_signal_to_deliver() goes to handle_group_stop()
    	handle_group_stop() returns when SIGNAL_GROUP_EXIT set
    	syscall_exit/resume_userspace notice TIF_SIGPENDING,
    	call get_signal_to_deliver() again.
    So we are wasting cpu cycles, and if one of these threads is rt_task() this
    may be a serious problem.
    NOTE: do_coredump() holds ->mmap_sem, so not stopped threads can't escape
    coredumping after clearing ->group_stop_count.
    See also this thread: http://marc.theaimsgroup.com/?t=112739139900002
    Signed-off-by: default avatarOleg Nesterov <oleg@tv-sign.ru>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>