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,
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to