Re: git: kernel: Remove an extra p_lock == 0 check

看板DFBSD_commit作者時間14年前 (2011/06/03 05:01), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/3 (看更多)
:commit 4a7e6f5530dd5eb9ca5195aeb18a0ebd59b0fa41 :Author: YONETANI Tomokazu <y0netan1@dragonflybsd.org> :Date: Thu Jun 2 14:17:46 2011 +0900 : : kernel: Remove an extra p_lock == 0 check : : proc_remove_zombie() waits for p_lock to drop to zero before removing : the process off zombproc, so this assertion is not needed (any more). : :Summary of changes: : sys/kern/kern_exit.c | 1 - : 1 files changed, 0 insertions(+), 1 deletions(-) : :http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/4a7e6f5530dd5eb9ca5195aeb18a0ebd59b0fa41 : I think we need one more addition. Since p_lock can be acquired during the process removal there need to be a final wait loop after the proc has been removed from all queues, just before the kfree(p). It will be a very rare case but it definitely can still occur if e.g. the SYSCTL_OUT code blocks on a VM fault or something like that. (untested patch below) -Matt Matthew Dillon <dillon@backplane.com> diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index 1e5a110..274f153 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -934,6 +934,17 @@ loop: } vm_waitproc(p); + + /* + * Temporary refs may still have been acquired while + * we removed the process, make sure they are all + * gone before kfree()ing. Now that the process has + * been removed from all lists and all references to + * it have gone away, no new refs can occur. + */ + while (p->p_lock) + tsleep(p, 0, "reap4", hz); + kfree(p, M_PROC); nprocs--; error = 0;
文章代碼(AID): #1Dv_eKt5 (DFBSD_commit)
文章代碼(AID): #1Dv_eKt5 (DFBSD_commit)