From 8bf6ff2226b52dfbd3cde8a5fbd9d68d88f02a9d Mon Sep 17 00:00:00 2001 From: Mateusz Guzik Date: Sat, 17 Feb 2018 17:23:43 +0000 Subject: [PATCH] Revert r329448. Turns out is is actually racy, reproducible with stress2/misc/truss.sh Requested by: kib --- sys/kern/kern_exit.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index b063bda5b7f..91ba499d1fa 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -1225,11 +1225,15 @@ loop_locked: nfound++; PROC_LOCK_ASSERT(p, MA_OWNED); + if ((options & (WTRAPPED | WUNTRACED)) != 0) + PROC_SLOCK(p); + if ((options & WTRAPPED) != 0 && (p->p_flag & P_TRACED) != 0 && (p->p_flag & (P_STOPPED_TRACE | P_STOPPED_SIG)) != 0 && p->p_suspcount == p->p_numthreads && (p->p_flag & P_WAITED) == 0) { + PROC_SUNLOCK(p); CTR4(KTR_PTRACE, "wait: returning trapped pid %d status %#x " "(xstat %d) xthread %d", @@ -1244,10 +1248,13 @@ loop_locked: (p->p_flag & P_STOPPED_SIG) != 0 && p->p_suspcount == p->p_numthreads && (p->p_flag & P_WAITED) == 0) { + PROC_SUNLOCK(p); report_alive_proc(td, p, siginfo, status, options, CLD_STOPPED); return (0); } + if ((options & (WTRAPPED | WUNTRACED)) != 0) + PROC_SUNLOCK(p); if ((options & WCONTINUED) != 0 && (p->p_flag & P_CONTINUED) != 0) { report_alive_proc(td, p, siginfo, status, options,