summaryrefslogtreecommitdiffstats
path: root/fs/quota_v1.c
diff options
context:
space:
mode:
authorOleg Nesterov <oleg@tv-sign.ru>2006-01-08 10:03:13 +0100
committerLinus Torvalds <torvalds@g5.osdl.org>2006-01-09 05:13:55 +0100
commitbb6f6dbaa48c53525a7a4f9d4df719c3b0b582af (patch)
treed8214a72c61d49e3cb896e0390256f23e9f72eff /fs/quota_v1.c
parent[PATCH] kill_proc_info_as_uid: don't use hardcoded constants (diff)
downloadlinux-bb6f6dbaa48c53525a7a4f9d4df719c3b0b582af.tar.xz
linux-bb6f6dbaa48c53525a7a4f9d4df719c3b0b582af.zip
[PATCH] do_coredump() should reset group_stop_count earlier
__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: Oleg Nesterov <oleg@tv-sign.ru> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/quota_v1.c')
0 files changed, 0 insertions, 0 deletions