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