Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 18 Feb 2018 21:07:15 +0000 (UTC)
From:      Mateusz Guzik <mjg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r329531 - head/sys/kern
Message-ID:  <201802182107.w1IL7F1j086537@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mjg
Date: Sun Feb 18 21:07:15 2018
New Revision: 329531
URL: https://svnweb.freebsd.org/changeset/base/329531

Log:
  exit: get rid of PROC_SLOCK when checking a process to report, take #2
  
  The suspension counter needs synchronisation through slock, but we don't
  need it to check if inspecting the counter is necessary to begin with.
  In the common case it is not, thus avoid the lock if possible.
  
  Reviewed by:	kib
  Tested by:	pho

Modified:
  head/sys/kern/kern_exit.c

Modified: head/sys/kern/kern_exit.c
==============================================================================
--- head/sys/kern/kern_exit.c	Sun Feb 18 20:49:43 2018	(r329530)
+++ head/sys/kern/kern_exit.c	Sun Feb 18 21:07:15 2018	(r329531)
@@ -1174,6 +1174,7 @@ kern_wait6(struct thread *td, idtype_t idtype, id_t id
 	struct proc *p, *q;
 	pid_t pid;
 	int error, nfound, ret;
+	bool report;
 
 	AUDIT_ARG_VALUE((int)idtype);	/* XXX - This is likely wrong! */
 	AUDIT_ARG_PID((pid_t)id);	/* XXX - This may be wrong! */
@@ -1225,36 +1226,38 @@ 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) {
+		    (p->p_flag & P_TRACED) != 0) {
+			PROC_SLOCK(p);
+			report =
+			    ((p->p_flag & (P_STOPPED_TRACE | P_STOPPED_SIG)) &&
+			    p->p_suspcount == p->p_numthreads &&
+			    (p->p_flag & P_WAITED) == 0);
 			PROC_SUNLOCK(p);
+			if (report) {
 			CTR4(KTR_PTRACE,
 			    "wait: returning trapped pid %d status %#x "
 			    "(xstat %d) xthread %d",
 			    p->p_pid, W_STOPCODE(p->p_xsig), p->p_xsig,
 			    p->p_xthread != NULL ?
 			    p->p_xthread->td_tid : -1);
-			report_alive_proc(td, p, siginfo, status, options,
-			    CLD_TRAPPED);
-			return (0);
+				report_alive_proc(td, p, siginfo, status,
+				    options, CLD_TRAPPED);
+				return (0);
+			}
 		}
 		if ((options & WUNTRACED) != 0 &&
-		    (p->p_flag & P_STOPPED_SIG) != 0 &&
-		    p->p_suspcount == p->p_numthreads &&
-		    (p->p_flag & P_WAITED) == 0) {
+		    (p->p_flag & P_STOPPED_SIG) != 0) {
+			PROC_SLOCK(p);
+			report = (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 (report) {
+				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,



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201802182107.w1IL7F1j086537>