From owner-svn-src-head@freebsd.org Mon Jul 31 14:56:36 2017 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id A555EDAFC65; Mon, 31 Jul 2017 14:56:36 +0000 (UTC) (envelope-from gallatin@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 6F34F7DD0D; Mon, 31 Jul 2017 14:56:36 +0000 (UTC) (envelope-from gallatin@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v6VEuZkr083623; Mon, 31 Jul 2017 14:56:35 GMT (envelope-from gallatin@FreeBSD.org) Received: (from gallatin@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v6VEuZvT083622; Mon, 31 Jul 2017 14:56:35 GMT (envelope-from gallatin@FreeBSD.org) Message-Id: <201707311456.v6VEuZvT083622@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: gallatin set sender to gallatin@FreeBSD.org using -f From: Andrew Gallatin Date: Mon, 31 Jul 2017 14:56:35 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r321790 - head/sbin/sysctl X-SVN-Group: head X-SVN-Commit-Author: gallatin X-SVN-Commit-Paths: head/sbin/sysctl X-SVN-Commit-Revision: 321790 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 31 Jul 2017 14:56:36 -0000 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);