Author: mjg
Date: Fri Nov  3 19:21:36 2017
New Revision: 325368
URL: https://svnweb.freebsd.org/changeset/base/325368

Log:
  Special-case pget lookups where pid == curproc->pid
  
  Saves on allproc_lock acquires during buildworld, poudriere etc.
  
  Submitted by: Pawel Biernacki <[email protected]>
  Sponsored by: Mysterious Code Ltd.
  Differential Revision:        D12929

Modified:
  head/sys/kern/kern_proc.c

Modified: head/sys/kern/kern_proc.c
==============================================================================
--- head/sys/kern/kern_proc.c   Fri Nov  3 19:08:59 2017        (r325367)
+++ head/sys/kern/kern_proc.c   Fri Nov  3 19:21:36 2017        (r325368)
@@ -389,23 +389,28 @@ pget(pid_t pid, int flags, struct proc **pp)
        struct proc *p;
        int error;
 
-       sx_slock(&allproc_lock);
-       if (pid <= PID_MAX) {
-               p = pfind_locked(pid);
-               if (p == NULL && (flags & PGET_NOTWEXIT) == 0)
-                       p = zpfind_locked(pid);
-       } else if ((flags & PGET_NOTID) == 0) {
-               p = pfind_tid_locked(pid);
+       p = curproc;
+       if (p->p_pid == pid) {
+               PROC_LOCK(p);
        } else {
-               p = NULL;
-       }
-       sx_sunlock(&allproc_lock);
-       if (p == NULL)
-               return (ESRCH);
-       if ((flags & PGET_CANSEE) != 0) {
-               error = p_cansee(curthread, p);
-               if (error != 0)
-                       goto errout;
+               sx_slock(&allproc_lock);
+               if (pid <= PID_MAX) {
+                       p = pfind_locked(pid);
+                       if (p == NULL && (flags & PGET_NOTWEXIT) == 0)
+                               p = zpfind_locked(pid);
+               } else if ((flags & PGET_NOTID) == 0) {
+                       p = pfind_tid_locked(pid);
+               } else {
+                       p = NULL;
+               }
+               sx_sunlock(&allproc_lock);
+               if (p == NULL)
+                       return (ESRCH);
+               if ((flags & PGET_CANSEE) != 0) {
+                       error = p_cansee(curthread, p);
+                       if (error != 0)
+                               goto errout;
+               }
        }
        if ((flags & PGET_CANDEBUG) != 0) {
                error = p_candebug(curthread, p);
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to