subr_param.c revision 195430
1247738Sbapt/*- 2247738Sbapt * Copyright (c) 1980, 1986, 1989, 1993 3247738Sbapt * The Regents of the University of California. All rights reserved. 4247738Sbapt * (c) UNIX System Laboratories, Inc. 5247738Sbapt * All or some portions of this file are derived from material licensed 6247738Sbapt * to the University of California by American Telephone and Telegraph 7247738Sbapt * Co. or Unix System Laboratories, Inc. and are reproduced herein with 8247738Sbapt * the permission of UNIX System Laboratories, Inc. 9247738Sbapt * 10247738Sbapt * Redistribution and use in source and binary forms, with or without 11247738Sbapt * modification, are permitted provided that the following conditions 12247738Sbapt * are met: 13247738Sbapt * 1. Redistributions of source code must retain the above copyright 14247738Sbapt * notice, this list of conditions and the following disclaimer. 15247738Sbapt * 2. Redistributions in binary form must reproduce the above copyright 16247738Sbapt * notice, this list of conditions and the following disclaimer in the 17247738Sbapt * documentation and/or other materials provided with the distribution. 18247738Sbapt * 4. Neither the name of the University nor the names of its contributors 19247738Sbapt * may be used to endorse or promote products derived from this software 20247738Sbapt * without specific prior written permission. 21247738Sbapt * 22247738Sbapt * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23247738Sbapt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24247738Sbapt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25247738Sbapt * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26247738Sbapt * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27247738Sbapt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28247738Sbapt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29247738Sbapt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30247738Sbapt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31247738Sbapt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32247738Sbapt * SUCH DAMAGE. 33247738Sbapt * 34247738Sbapt * @(#)param.c 8.3 (Berkeley) 8/20/94 35247738Sbapt */ 36247738Sbapt 37247738Sbapt#include <sys/cdefs.h> 38247738Sbapt__FBSDID("$FreeBSD: head/sys/kern/subr_param.c 195430 2009-07-08 01:09:12Z silby $"); 39247738Sbapt 40247738Sbapt#include "opt_param.h" 41247738Sbapt#include "opt_maxusers.h" 42247738Sbapt 43247738Sbapt#include <sys/param.h> 44247738Sbapt#include <sys/systm.h> 45247738Sbapt#include <sys/kernel.h> 46247738Sbapt#include <sys/sysctl.h> 47247738Sbapt 48247738Sbapt#include <vm/vm_param.h> 49247738Sbapt 50247738Sbapt/* 51247738Sbapt * System parameter formulae. 52247738Sbapt */ 53247738Sbapt 54247738Sbapt#ifndef HZ 55247738Sbapt# if defined(__amd64__) || defined(__i386__) || defined(__ia64__) || defined(__sparc64__) 56247738Sbapt# define HZ 1000 57247738Sbapt# else 58247738Sbapt# define HZ 100 59247738Sbapt# endif 60247738Sbapt# ifndef HZ_VM 61247738Sbapt# define HZ_VM 100 62247738Sbapt# endif 63247738Sbapt#else 64247738Sbapt# ifndef HZ_VM 65247738Sbapt# define HZ_VM HZ 66247738Sbapt# endif 67247738Sbapt#endif 68247738Sbapt#define NPROC (20 + 16 * maxusers) 69247738Sbapt#ifndef NBUF 70247738Sbapt#define NBUF 0 71247738Sbapt#endif 72247738Sbapt#ifndef MAXFILES 73247738Sbapt#define MAXFILES (maxproc * 2) 74247738Sbapt#endif 75247738Sbapt 76247738Sbapt/* Values of enum VM_GUEST members are used as indices in 77247738Sbapt * vm_guest_sysctl_names */ 78247738Sbaptenum VM_GUEST { VM_GUEST_NO = 0, VM_GUEST_VM, VM_GUEST_XEN }; 79247738Sbapt 80247738Sbaptstatic int sysctl_kern_vm_guest(SYSCTL_HANDLER_ARGS); 81247738Sbapt 82247738Sbaptint hz; 83247738Sbaptint tick; 84247738Sbaptint maxusers; /* base tunable */ 85247738Sbaptint maxproc; /* maximum # of processes */ 86247738Sbaptint maxprocperuid; /* max # of procs per user */ 87247738Sbaptint maxfiles; /* sys. wide open files limit */ 88247738Sbaptint maxfilesperproc; /* per-proc open files limit */ 89247738Sbaptint ncallout; /* maximum # of timer events */ 90247738Sbaptint nbuf; 91247738Sbaptint nswbuf; 92247738Sbaptlong maxswzone; /* max swmeta KVA storage */ 93247738Sbaptlong maxbcache; /* max buffer cache KVA storage */ 94247738Sbaptlong maxpipekva; /* Limit on pipe KVA */ 95247738Sbaptint vm_guest; /* Running as virtual machine guest? */ 96247738Sbaptu_long maxtsiz; /* max text size */ 97247738Sbaptu_long dfldsiz; /* initial data size limit */ 98247738Sbaptu_long maxdsiz; /* max data size */ 99247738Sbaptu_long dflssiz; /* initial stack size limit */ 100247738Sbaptu_long maxssiz; /* max stack size */ 101247738Sbaptu_long sgrowsiz; /* amount to grow stack */ 102247738Sbapt 103247738SbaptSYSCTL_INT(_kern, OID_AUTO, hz, CTLFLAG_RDTUN, &hz, 0, 104247738Sbapt "Number of clock ticks per second"); 105247738SbaptSYSCTL_INT(_kern, OID_AUTO, ncallout, CTLFLAG_RDTUN, &ncallout, 0, 106247738Sbapt "Number of pre-allocated timer events"); 107247738SbaptSYSCTL_INT(_kern, OID_AUTO, nbuf, CTLFLAG_RDTUN, &nbuf, 0, 108247738Sbapt "Number of buffers in the buffer cache"); 109247738SbaptSYSCTL_INT(_kern, OID_AUTO, nswbuf, CTLFLAG_RDTUN, &nswbuf, 0, 110247738Sbapt "Number of swap buffers"); 111247738SbaptSYSCTL_LONG(_kern, OID_AUTO, maxswzone, CTLFLAG_RDTUN, &maxswzone, 0, 112247738Sbapt "Maximum memory for swap metadata"); 113247738SbaptSYSCTL_LONG(_kern, OID_AUTO, maxbcache, CTLFLAG_RDTUN, &maxbcache, 0, 114247738Sbapt "Maximum value of vfs.maxbufspace"); 115247738SbaptSYSCTL_ULONG(_kern, OID_AUTO, maxtsiz, CTLFLAG_RDTUN, &maxtsiz, 0, 116247738Sbapt "Maximum text size"); 117247738SbaptSYSCTL_ULONG(_kern, OID_AUTO, dfldsiz, CTLFLAG_RDTUN, &dfldsiz, 0, 118247738Sbapt "Initial data size limit"); 119247738SbaptSYSCTL_ULONG(_kern, OID_AUTO, maxdsiz, CTLFLAG_RDTUN, &maxdsiz, 0, 120247738Sbapt "Maximum data size"); 121247738SbaptSYSCTL_ULONG(_kern, OID_AUTO, dflssiz, CTLFLAG_RDTUN, &dflssiz, 0, 122247738Sbapt "Initial stack size limit"); 123247738SbaptSYSCTL_ULONG(_kern, OID_AUTO, maxssiz, CTLFLAG_RDTUN, &maxssiz, 0, 124247738Sbapt "Maximum stack size"); 125247738SbaptSYSCTL_ULONG(_kern, OID_AUTO, sgrowsiz, CTLFLAG_RDTUN, &sgrowsiz, 0, 126247738Sbapt "Amount to grow stack on a stack fault"); 127247738SbaptSYSCTL_PROC(_kern, OID_AUTO, vm_guest, CTLFLAG_RD | CTLTYPE_STRING, 128247738Sbapt NULL, 0, sysctl_kern_vm_guest, "A", 129247738Sbapt "Virtual machine detected? (none|generic|xen)"); 130247738Sbapt 131247738Sbapt/* 132247738Sbapt * These have to be allocated somewhere; allocating 133247738Sbapt * them here forces loader errors if this file is omitted 134247738Sbapt * (if they've been externed everywhere else; hah!). 135247738Sbapt */ 136247738Sbaptstruct buf *swbuf; 137247738Sbapt 138247738Sbaptstatic const char *const vm_guest_sysctl_names[] = { 139247738Sbapt "none", 140247738Sbapt "generic", 141247738Sbapt "xen", 142247738Sbapt NULL 143247738Sbapt}; 144247738Sbapt 145247738Sbapt#ifndef XEN 146247738Sbaptstatic const char *const vm_bnames[] = { 147247738Sbapt "QEMU", /* QEMU */ 148247738Sbapt "Plex86", /* Plex86 */ 149247738Sbapt "Bochs", /* Bochs */ 150247738Sbapt NULL 151247738Sbapt}; 152247738Sbapt 153247738Sbaptstatic const char *const vm_pnames[] = { 154247738Sbapt "VMware Virtual Platform", /* VMWare VM */ 155247738Sbapt "Virtual Machine", /* Microsoft VirtualPC */ 156247738Sbapt "VirtualBox", /* Sun xVM VirtualBox */ 157247738Sbapt "Parallels Virtual Platform", /* Parallels VM */ 158247738Sbapt NULL 159247738Sbapt}; 160247738Sbapt 161247738Sbapt 162247738Sbapt/* 163247738Sbapt * Detect known Virtual Machine hosts by inspecting the emulated BIOS. 164247738Sbapt */ 165247738Sbaptstatic enum VM_GUEST 166247738Sbaptdetect_virtual(void) 167247738Sbapt{ 168247738Sbapt char *sysenv; 169247738Sbapt int i; 170247738Sbapt 171247738Sbapt sysenv = getenv("smbios.bios.vendor"); 172247738Sbapt if (sysenv != NULL) { 173247738Sbapt for (i = 0; vm_bnames[i] != NULL; i++) 174247738Sbapt if (strcmp(sysenv, vm_bnames[i]) == 0) { 175247738Sbapt freeenv(sysenv); 176247738Sbapt return (VM_GUEST_VM); 177247738Sbapt } 178247738Sbapt freeenv(sysenv); 179247738Sbapt } 180247738Sbapt sysenv = getenv("smbios.system.product"); 181247738Sbapt if (sysenv != NULL) { 182247738Sbapt for (i = 0; vm_pnames[i] != NULL; i++) 183247738Sbapt if (strcmp(sysenv, vm_pnames[i]) == 0) { 184247738Sbapt freeenv(sysenv); 185247738Sbapt return (VM_GUEST_VM); 186247738Sbapt } 187247738Sbapt freeenv(sysenv); 188247738Sbapt } 189247738Sbapt return (VM_GUEST_NO); 190247738Sbapt} 191247738Sbapt#endif 192247738Sbapt 193247738Sbapt/* 194247738Sbapt * Boot time overrides that are not scaled against main memory 195247738Sbapt */ 196247738Sbaptvoid 197247738Sbaptinit_param1(void) 198247738Sbapt{ 199247738Sbapt#ifndef XEN 200247738Sbapt vm_guest = detect_virtual(); 201247738Sbapt#else 202247738Sbapt vm_guest = VM_GUEST_XEN; 203247738Sbapt#endif 204247738Sbapt hz = -1; 205247738Sbapt TUNABLE_INT_FETCH("kern.hz", &hz); 206247738Sbapt if (hz == -1) 207247738Sbapt hz = vm_guest > VM_GUEST_NO ? HZ_VM : HZ; 208247738Sbapt tick = 1000000 / hz; 209247738Sbapt 210247738Sbapt#ifdef VM_SWZONE_SIZE_MAX 211247738Sbapt maxswzone = VM_SWZONE_SIZE_MAX; 212247738Sbapt#endif 213247738Sbapt TUNABLE_LONG_FETCH("kern.maxswzone", &maxswzone); 214247738Sbapt#ifdef VM_BCACHE_SIZE_MAX 215247738Sbapt maxbcache = VM_BCACHE_SIZE_MAX; 216247738Sbapt#endif 217247738Sbapt TUNABLE_LONG_FETCH("kern.maxbcache", &maxbcache); 218247738Sbapt 219247738Sbapt maxtsiz = MAXTSIZ; 220247738Sbapt TUNABLE_ULONG_FETCH("kern.maxtsiz", &maxtsiz); 221247738Sbapt dfldsiz = DFLDSIZ; 222247738Sbapt TUNABLE_ULONG_FETCH("kern.dfldsiz", &dfldsiz); 223247738Sbapt maxdsiz = MAXDSIZ; 224247738Sbapt TUNABLE_ULONG_FETCH("kern.maxdsiz", &maxdsiz); 225247738Sbapt dflssiz = DFLSSIZ; 226247738Sbapt TUNABLE_ULONG_FETCH("kern.dflssiz", &dflssiz); 227247738Sbapt maxssiz = MAXSSIZ; 228247738Sbapt TUNABLE_ULONG_FETCH("kern.maxssiz", &maxssiz); 229247738Sbapt sgrowsiz = SGROWSIZ; 230247738Sbapt TUNABLE_ULONG_FETCH("kern.sgrowsiz", &sgrowsiz); 231247738Sbapt} 232247738Sbapt 233247738Sbapt/* 234247738Sbapt * Boot time overrides that are scaled against main memory 235247738Sbapt */ 236247738Sbaptvoid 237247738Sbaptinit_param2(long physpages) 238247738Sbapt{ 239247738Sbapt 240247738Sbapt /* Base parameters */ 241247738Sbapt maxusers = MAXUSERS; 242247738Sbapt TUNABLE_INT_FETCH("kern.maxusers", &maxusers); 243247738Sbapt if (maxusers == 0) { 244247738Sbapt maxusers = physpages / (2 * 1024 * 1024 / PAGE_SIZE); 245247738Sbapt if (maxusers < 32) 246247738Sbapt maxusers = 32; 247247738Sbapt if (maxusers > 384) 248247738Sbapt maxusers = 384; 249247738Sbapt } 250247738Sbapt 251247738Sbapt /* 252247738Sbapt * The following can be overridden after boot via sysctl. Note: 253247738Sbapt * unless overriden, these macros are ultimately based on maxusers. 254247738Sbapt */ 255247738Sbapt maxproc = NPROC; 256247738Sbapt TUNABLE_INT_FETCH("kern.maxproc", &maxproc); 257247738Sbapt /* 258247738Sbapt * Limit maxproc so that kmap entries cannot be exhausted by 259247738Sbapt * processes. 260247738Sbapt */ 261247738Sbapt if (maxproc > (physpages / 12)) 262247738Sbapt maxproc = physpages / 12; 263247738Sbapt maxfiles = MAXFILES; 264247738Sbapt TUNABLE_INT_FETCH("kern.maxfiles", &maxfiles); 265247738Sbapt maxprocperuid = (maxproc * 9) / 10; 266247738Sbapt maxfilesperproc = (maxfiles * 9) / 10; 267247738Sbapt 268247738Sbapt /* 269247738Sbapt * Cannot be changed after boot. 270247738Sbapt */ 271247738Sbapt nbuf = NBUF; 272247738Sbapt TUNABLE_INT_FETCH("kern.nbuf", &nbuf); 273247738Sbapt 274247738Sbapt ncallout = 16 + maxproc + maxfiles; 275247738Sbapt TUNABLE_INT_FETCH("kern.ncallout", &ncallout); 276247738Sbapt} 277247738Sbapt 278247738Sbapt/* 279247738Sbapt * Boot time overrides that are scaled against the kmem map 280247738Sbapt */ 281247738Sbaptvoid 282247738Sbaptinit_param3(long kmempages) 283247738Sbapt{ 284247738Sbapt 285247738Sbapt /* 286247738Sbapt * The default for maxpipekva is max(5% of the kmem map, 512KB). 287247738Sbapt * See sys_pipe.c for more details. 288247738Sbapt */ 289247738Sbapt maxpipekva = (kmempages / 20) * PAGE_SIZE; 290247738Sbapt if (maxpipekva < 512 * 1024) 291247738Sbapt maxpipekva = 512 * 1024; 292247738Sbapt TUNABLE_LONG_FETCH("kern.ipc.maxpipekva", &maxpipekva); 293247738Sbapt} 294247738Sbapt 295247738Sbapt/* 296247738Sbapt * Sysctl stringiying handler for kern.vm_guest. 297247738Sbapt */ 298247738Sbaptstatic int 299247738Sbaptsysctl_kern_vm_guest(SYSCTL_HANDLER_ARGS) 300247738Sbapt{ 301247738Sbapt return (SYSCTL_OUT(req, vm_guest_sysctl_names[vm_guest], 302247738Sbapt strlen(vm_guest_sysctl_names[vm_guest]))); 303247738Sbapt} 304247738Sbapt