svn commit: r355083 - head/sys/kern

Ryan Libby rlibby at FreeBSD.org
Mon Nov 25 07:38:28 UTC 2019


Author: rlibby
Date: Mon Nov 25 07:38:27 2019
New Revision: 355083
URL: https://svnweb.freebsd.org/changeset/base/355083

Log:
  sysctl sysctls: wire old buf before output with sysctl lock
  
  Several sysctl sysctls output to a user buffer while holding a
  non-sleepable lock that protects the sysctl topology.  They need to wire
  the output buffer, or else they may try to sleep on a page fault.
  
  Reviewed by:	cem, markj
  Sponsored by:	Dell EMC Isilon
  Differential Revision:	https://reviews.freebsd.org/D22528

Modified:
  head/sys/kern/kern_sysctl.c

Modified: head/sys/kern/kern_sysctl.c
==============================================================================
--- head/sys/kern/kern_sysctl.c	Mon Nov 25 07:13:05 2019	(r355082)
+++ head/sys/kern/kern_sysctl.c	Mon Nov 25 07:38:27 2019	(r355083)
@@ -1023,12 +1023,16 @@ sysctl_sysctl_name(SYSCTL_HANDLER_ARGS)
 {
 	int *name = (int *) arg1;
 	u_int namelen = arg2;
-	int error = 0;
+	int error;
 	struct sysctl_oid *oid;
 	struct sysctl_oid_list *lsp = &sysctl__children, *lsp2;
 	struct rm_priotracker tracker;
 	char buf[10];
 
+	error = sysctl_wire_old_buffer(req, 0);
+	if (error)
+		return (error);
+
 	SYSCTL_RLOCK(&tracker);
 	while (namelen) {
 		if (!lsp) {
@@ -1265,6 +1269,10 @@ sysctl_sysctl_oidfmt(SYSCTL_HANDLER_ARGS)
 	struct rm_priotracker tracker;
 	int error;
 
+	error = sysctl_wire_old_buffer(req, 0);
+	if (error)
+		return (error);
+
 	SYSCTL_RLOCK(&tracker);
 	error = sysctl_find_oid(arg1, arg2, &oid, NULL, req);
 	if (error)
@@ -1294,6 +1302,10 @@ sysctl_sysctl_oiddescr(SYSCTL_HANDLER_ARGS)
 	struct rm_priotracker tracker;
 	int error;
 
+	error = sysctl_wire_old_buffer(req, 0);
+	if (error)
+		return (error);
+
 	SYSCTL_RLOCK(&tracker);
 	error = sysctl_find_oid(arg1, arg2, &oid, NULL, req);
 	if (error)
@@ -1318,6 +1330,10 @@ sysctl_sysctl_oidlabel(SYSCTL_HANDLER_ARGS)
 	struct sysctl_oid *oid;
 	struct rm_priotracker tracker;
 	int error;
+
+	error = sysctl_wire_old_buffer(req, 0);
+	if (error)
+		return (error);
 
 	SYSCTL_RLOCK(&tracker);
 	error = sysctl_find_oid(arg1, arg2, &oid, NULL, req);


More information about the svn-src-all mailing list