summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2007-05-14 22:21:58 +0000
committerjhb <jhb@FreeBSD.org>2007-05-14 22:21:58 +0000
commit77d161b46b5af0e16571ad43b660bcafb3bc3039 (patch)
treeb157dbdf4d94b30f7dfc04ac706e1552547a31e8 /sys
parent2b1170b7f0d8d7f8db62041decf2e8933d65441d (diff)
downloadFreeBSD-src-77d161b46b5af0e16571ad43b660bcafb3bc3039.zip
FreeBSD-src-77d161b46b5af0e16571ad43b660bcafb3bc3039.tar.gz
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
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/kern_exit.c26
1 files changed, 10 insertions, 16 deletions
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c
index 1d60fe7..029fe3a 100644
--- a/sys/kern/kern_exit.c
+++ b/sys/kern/kern_exit.c
@@ -406,6 +406,16 @@ retry:
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.
*/
sx_xlock(&proctree_lock);
@@ -484,22 +494,6 @@ retry:
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);
/*
OpenPOWER on IntegriCloud