svn commit: r325368 - head/sys/kern

Mateusz Guzik mjg at FreeBSD.org
Fri Nov 3 19:21:37 UTC 2017


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 <pawel.biernacki at gmail.com>
  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);


More information about the svn-src-all mailing list