diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index a4c53e9d1a41..f88c7cf28f59 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -284,15 +284,6 @@ exit1(struct thread *td, int rval, int signo) p->p_flag |= P_WEXIT; wakeup(&p->p_stype); - /* - * If P_PPWAIT is set our parent holds us with p_lock and may - * be waiting on p_pwait. - */ - if (p->p_flag & P_PPWAIT) { - p->p_flag &= ~P_PPWAIT; - cv_broadcast(&p->p_pwait); - } - /* * Wait for any processes that have a hold on our vmspace to * release their reference. @@ -338,9 +329,13 @@ exit1(struct thread *td, int rval, int signo) */ EVENTHANDLER_DIRECT_INVOKE(process_exit, p); + /* + * If parent is waiting for us to exit or exec, + * P_PPWAIT is set; we will wakeup the parent below. + */ PROC_LOCK(p); stopprofclock(p); - p->p_flag &= ~(P_TRACED | P_PPTRACE); + p->p_flag &= ~(P_TRACED | P_PPWAIT | P_PPTRACE); p->p_ptevents = 0; /* @@ -641,6 +636,7 @@ exit1(struct thread *td, int rval, int signo) * proc lock. */ wakeup(p->p_pptr); + cv_broadcast(&p->p_pwait); sched_exit(p->p_pptr, td); PROC_SLOCK(p); p->p_state = PRS_ZOMBIE; diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index 4d8e66121f4f..050e4651d098 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -720,7 +720,6 @@ do_fork(struct thread *td, struct fork_req *fr, struct proc *p2, struct thread * dtrace_fasttrap_fork(p1, p2); #endif if (fr->fr_flags & RFPPWAIT) { - _PHOLD(p2); td->td_pflags |= TDP_RFPPWAIT; td->td_rfppwait_p = p2; td->td_dbgflags |= TDB_VFORK; diff --git a/sys/kern/subr_syscall.c b/sys/kern/subr_syscall.c index d6ab0bc7d275..9bfd4e965da2 100644 --- a/sys/kern/subr_syscall.c +++ b/sys/kern/subr_syscall.c @@ -257,7 +257,6 @@ syscallret(struct thread *td, int error) } cv_timedwait(&p2->p_pwait, &p2->p_mtx, hz); } - _PRELE(p2); PROC_UNLOCK(p2); if (td->td_dbgflags & TDB_VFORK) {