Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 31 Jul 2017 14:56:35 +0000 (UTC)
From:      Andrew Gallatin <gallatin@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r321790 - head/sbin/sysctl
Message-ID:  <201707311456.v6VEuZvT083622@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gallatin
Date: Mon Jul 31 14:56:35 2017
New Revision: 321790
URL: https://svnweb.freebsd.org/changeset/base/321790

Log:
  Don't request CTLTYPE_OPAQUE if we can't print them.
  
  The intent is to skip expensive opaque sysctls like tcp_pcblist unless
  they are explicitly requested. Sysctl nodes like this don't show up in
  sysctl -a, but they do generate output that winds up being dropped,
  unless the user specifically requested  binary/hex output or opaques.
  
  This reduces the runtime of sysctl in many circumstances on a loaded
  system.  It also reduces the likelihood that simply gathering
  diagnostics on a sick machine (stuck lock, etc) via sysctl -a might
  push it over the edge into a total lockup.
  
  Reviewed by:	jtl
  Sponsored by:	Netflix
  Differential Revision:	https://reviews.freebsd.org/D11461

Modified:
  head/sbin/sysctl/sysctl.c

Modified: head/sbin/sysctl/sysctl.c
==============================================================================
--- head/sbin/sysctl/sysctl.c	Mon Jul 31 14:53:03 2017	(r321789)
+++ head/sbin/sysctl/sysctl.c	Mon Jul 31 14:56:35 2017	(r321790)
@@ -925,6 +925,32 @@ show_var(int *oid, int nlen)
 		printf("%s", buf);
 		return (0);
 	}
+
+	/* don't fetch opaques that we don't know how to print */
+	if (ctltype == CTLTYPE_OPAQUE) {
+		if (strcmp(fmt, "S,clockinfo") == 0)
+			func = S_clockinfo;
+		else if (strcmp(fmt, "S,timeval") == 0)
+			func = S_timeval;
+		else if (strcmp(fmt, "S,loadavg") == 0)
+			func = S_loadavg;
+		else if (strcmp(fmt, "S,vmtotal") == 0)
+			func = S_vmtotal;
+#ifdef __amd64__
+		else if (strcmp(fmt, "S,efi_map_header") == 0)
+			func = S_efi_map;
+#endif
+#if defined(__amd64__) || defined(__i386__)
+		else if (strcmp(fmt, "S,bios_smap_xattr") == 0)
+			func = S_bios_smap_xattr;
+#endif
+		else {
+			func = NULL;
+			if (!bflag && !oflag && !xflag)
+				return (1);
+		}
+	}
+
 	/* find an estimate of how much we need for this var */
 	if (Bflag)
 		j = Bflag;
@@ -1045,24 +1071,6 @@ show_var(int *oid, int nlen)
 
 	case CTLTYPE_OPAQUE:
 		i = 0;
-		if (strcmp(fmt, "S,clockinfo") == 0)
-			func = S_clockinfo;
-		else if (strcmp(fmt, "S,timeval") == 0)
-			func = S_timeval;
-		else if (strcmp(fmt, "S,loadavg") == 0)
-			func = S_loadavg;
-		else if (strcmp(fmt, "S,vmtotal") == 0)
-			func = S_vmtotal;
-#ifdef __amd64__
-		else if (strcmp(fmt, "S,efi_map_header") == 0)
-			func = S_efi_map;
-#endif
-#if defined(__amd64__) || defined(__i386__)
-		else if (strcmp(fmt, "S,bios_smap_xattr") == 0)
-			func = S_bios_smap_xattr;
-#endif
-		else
-			func = NULL;
 		if (func) {
 			if (!nflag)
 				printf("%s%s", name, sep);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201707311456.v6VEuZvT083622>