From 77d161b46b5af0e16571ad43b660bcafb3bc3039 Mon Sep 17 00:00:00 2001 From: jhb Date: Mon, 14 May 2007 22:21:58 +0000 Subject: [PATCH] Move cpu_exit() earlier in exit1() to close a race between SIGCHLD/kevent(2) notification of process termination and wait(). Now we no longer drop locks between sending the notification and marking the process as a zombie. Previously, if another process attempted to do a wait() with W_NOHANG after receiving a SIGCHLD or kevent and locked the process while the exiting thread was in cpu_exit(), then wait() would fail to find the process, which is quite astonishing to the process calling wait(). MFC after: 3 days --- sys/kern/kern_exit.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index 1d60fe729152..029fe3a12f4b 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -405,6 +405,16 @@ exit1(struct thread *td, int rv) LIST_REMOVE(p, p_hash); sx_xunlock(&allproc_lock); + /* + * Call machine-dependent code to release any + * machine-dependent resources other than the address space. + * The address space is released by "vmspace_exitfree(p)" in + * vm_waitproc(). + */ + cpu_exit(td); + + WITNESS_WARN(WARN_PANIC, NULL, "process (pid %d) exiting", p->p_pid); + /* * Reparent all of our children to init. */ @@ -484,22 +494,6 @@ exit1(struct thread *td, int rv) else /* LINUX thread */ psignal(p->p_pptr, p->p_sigparent); } - PROC_UNLOCK(p->p_pptr); - PROC_UNLOCK(p); - - /* - * Finally, call machine-dependent code to release the remaining - * resources including address space. - * The address space is released by "vmspace_exitfree(p)" in - * vm_waitproc(). - */ - cpu_exit(td); - - WITNESS_WARN(WARN_PANIC, &proctree_lock.lock_object, - "process (pid %d) exiting", p->p_pid); - - PROC_LOCK(p); - PROC_LOCK(p->p_pptr); sx_xunlock(&proctree_lock); /*