svn commit: r325726 - head/sys/kern

Mateusz Guzik mjg at FreeBSD.org
Sat Nov 11 22:39:35 UTC 2017


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);
 


More information about the svn-src-head mailing list