Author: mjg
Date: Sat Nov 11 22:39:33 2017
New Revision: 325726
URL: https://svnweb.freebsd.org/changeset/base/325726
Log:
Avoid locking and refing in sysctl_kern_proc_args if possible.
Turns out the sysctl is called a lot e.g. by pkg-static.
Modified:
head/sys/kern/kern_proc.c
Modified: head/sys/kern/kern_proc.c
==============================================================================
--- head/sys/kern/kern_proc.c Sat Nov 11 21:50:36 2017 (r325725)
+++ head/sys/kern/kern_proc.c Sat Nov 11 22:39:33 2017 (r325726)
@@ -1909,14 +1909,27 @@ sysctl_kern_proc_args(SYSCTL_HANDLER_ARGS)
struct proc *p;
struct sbuf sb;
int flags, error = 0, error2;
+ pid_t pid;
if (namelen != 1)
return (EINVAL);
+ pid = (pid_t)name[0];
+ /*
+ * If the query is for this process and it is single-threaded, there
+ * is nobody to modify pargs, thus we can just read.
+ */
+ p = curproc;
+ if (pid == p->p_pid && p->p_numthreads == 1 && req->newptr == NULL) {
+ if ((pa = p->p_args) != NULL)
+ error = SYSCTL_OUT(req, pa->ar_args, pa->ar_length);
+ return (error);
+ }
+
flags = PGET_CANSEE;
if (req->newptr != NULL)
flags |= PGET_ISCURRENT;
- error = pget((pid_t)name[0], flags, &p);
+ error = pget(pid, flags, &p);
if (error)
return (error);
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"