svn commit: r329531 - head/sys/kern

Mateusz Guzik mjg at FreeBSD.org
Sun Feb 18 21:07:16 UTC 2018


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,


More information about the svn-src-all mailing list