subr_param.c revision 240501
1170620Sbms/*- 2189335Sbms * Copyright (c) 1980, 1986, 1989, 1993 3189335Sbms * The Regents of the University of California. All rights reserved. 4170620Sbms * (c) UNIX System Laboratories, Inc. 5170620Sbms * All or some portions of this file are derived from material licensed 6170620Sbms * to the University of California by American Telephone and Telegraph 7170620Sbms * Co. or Unix System Laboratories, Inc. and are reproduced herein with 8170620Sbms * the permission of UNIX System Laboratories, Inc. 9170620Sbms * 10170620Sbms * Redistribution and use in source and binary forms, with or without 11170620Sbms * modification, are permitted provided that the following conditions 12170620Sbms * are met: 13170620Sbms * 1. Redistributions of source code must retain the above copyright 14189335Sbms * notice, this list of conditions and the following disclaimer. 15189335Sbms * 2. Redistributions in binary form must reproduce the above copyright 16189335Sbms * notice, this list of conditions and the following disclaimer in the 17189335Sbms * documentation and/or other materials provided with the distribution. 18189335Sbms * 4. Neither the name of the University nor the names of its contributors 19189335Sbms * may be used to endorse or promote products derived from this software 20189335Sbms * without specific prior written permission. 21189335Sbms * 22189335Sbms * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23189335Sbms * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24189335Sbms * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25170620Sbms * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26170620Sbms * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27170620Sbms * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28170620Sbms * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29170620Sbms * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30170620Sbms * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31170620Sbms * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32170620Sbms * SUCH DAMAGE. 33170620Sbms * 34170620Sbms * @(#)param.c 8.3 (Berkeley) 8/20/94 35170620Sbms */ 36170620Sbms 37170620Sbms#include <sys/cdefs.h> 38170620Sbms__FBSDID("$FreeBSD: stable/9/sys/kern/subr_param.c 240501 2012-09-14 14:23:17Z zont $"); 39170620Sbms 40170620Sbms#include "opt_param.h" 41170620Sbms#include "opt_msgbuf.h" 42170620Sbms#include "opt_maxusers.h" 43170620Sbms 44170620Sbms#include <sys/param.h> 45170620Sbms#include <sys/systm.h> 46170620Sbms#include <sys/kernel.h> 47170620Sbms#include <sys/limits.h> 48170620Sbms#include <sys/msgbuf.h> 49170620Sbms#include <sys/sysctl.h> 50170620Sbms#include <sys/proc.h> 51170620Sbms 52170620Sbms#include <vm/vm.h> 53170620Sbms#include <vm/vm_param.h> 54170620Sbms#include <vm/pmap.h> 55170620Sbms 56170620Sbms/* 57170620Sbms * System parameter formulae. 58170620Sbms */ 59170620Sbms 60170620Sbms#ifndef HZ 61170620Sbms# if defined(__mips__) || defined(__arm__) 62170620Sbms# define HZ 100 63170620Sbms# else 64170620Sbms# define HZ 1000 65170620Sbms# endif 66170620Sbms# ifndef HZ_VM 67170620Sbms# define HZ_VM 100 68170620Sbms# endif 69170620Sbms#else 70170620Sbms# ifndef HZ_VM 71170620Sbms# define HZ_VM HZ 72170620Sbms# endif 73170620Sbms#endif 74170620Sbms#define NPROC (20 + 16 * maxusers) 75170620Sbms#ifndef NBUF 76170620Sbms#define NBUF 0 77170620Sbms#endif 78170620Sbms#ifndef MAXFILES 79170620Sbms#define MAXFILES (maxproc * 2) 80170620Sbms#endif 81170620Sbms 82170620Sbmsstatic int sysctl_kern_vm_guest(SYSCTL_HANDLER_ARGS); 83170620Sbms 84170620Sbmsint hz; 85170620Sbmsint tick; 86170620Sbmsint maxusers; /* base tunable */ 87170620Sbmsint maxproc; /* maximum # of processes */ 88170620Sbmsint maxprocperuid; /* max # of procs per user */ 89170620Sbmsint maxfiles; /* sys. wide open files limit */ 90170620Sbmsint maxfilesperproc; /* per-proc open files limit */ 91170620Sbmsint msgbufsize; /* size of kernel message buffer */ 92170620Sbmsint ncallout; /* maximum # of timer events */ 93170620Sbmsint nbuf; 94170620Sbmsint ngroups_max; /* max # groups per process */ 95170620Sbmsint nswbuf; 96170620Sbmspid_t pid_max = PID_MAX; 97170620Sbmslong maxswzone; /* max swmeta KVA storage */ 98170620Sbmslong maxbcache; /* max buffer cache KVA storage */ 99170620Sbmslong maxpipekva; /* Limit on pipe KVA */ 100170620Sbmsint vm_guest; /* Running as virtual machine guest? */ 101170620Sbmsu_long maxtsiz; /* max text size */ 102170620Sbmsu_long dfldsiz; /* initial data size limit */ 103170620Sbmsu_long maxdsiz; /* max data size */ 104170620Sbmsu_long dflssiz; /* initial stack size limit */ 105170620Sbmsu_long maxssiz; /* max stack size */ 106170620Sbmsu_long sgrowsiz; /* amount to grow stack */ 107170620Sbms 108170620SbmsSYSCTL_INT(_kern, OID_AUTO, hz, CTLFLAG_RDTUN, &hz, 0, 109170620Sbms "Number of clock ticks per second"); 110170620SbmsSYSCTL_INT(_kern, OID_AUTO, ncallout, CTLFLAG_RDTUN, &ncallout, 0, 111170620Sbms "Number of pre-allocated timer events"); 112170620SbmsSYSCTL_INT(_kern, OID_AUTO, nbuf, CTLFLAG_RDTUN, &nbuf, 0, 113170620Sbms "Number of buffers in the buffer cache"); 114170620SbmsSYSCTL_INT(_kern, OID_AUTO, nswbuf, CTLFLAG_RDTUN, &nswbuf, 0, 115170620Sbms "Number of swap buffers"); 116170620SbmsSYSCTL_INT(_kern, OID_AUTO, msgbufsize, CTLFLAG_RDTUN, &msgbufsize, 0, 117170620Sbms "Size of the kernel message buffer"); 118170620SbmsSYSCTL_LONG(_kern, OID_AUTO, maxswzone, CTLFLAG_RDTUN, &maxswzone, 0, 119170620Sbms "Maximum memory for swap metadata"); 120170620SbmsSYSCTL_LONG(_kern, OID_AUTO, maxbcache, CTLFLAG_RDTUN, &maxbcache, 0, 121170620Sbms "Maximum value of vfs.maxbufspace"); 122170620SbmsSYSCTL_ULONG(_kern, OID_AUTO, maxtsiz, CTLFLAG_RW | CTLFLAG_TUN, &maxtsiz, 0, 123235640Smarcel "Maximum text size"); 124170620SbmsSYSCTL_ULONG(_kern, OID_AUTO, dfldsiz, CTLFLAG_RW | CTLFLAG_TUN, &dfldsiz, 0, 125170620Sbms "Initial data size limit"); 126170620SbmsSYSCTL_ULONG(_kern, OID_AUTO, maxdsiz, CTLFLAG_RW | CTLFLAG_TUN, &maxdsiz, 0, 127170620Sbms "Maximum data size"); 128170620SbmsSYSCTL_ULONG(_kern, OID_AUTO, dflssiz, CTLFLAG_RW | CTLFLAG_TUN, &dflssiz, 0, 129170620Sbms "Initial stack size limit"); 130170620SbmsSYSCTL_ULONG(_kern, OID_AUTO, maxssiz, CTLFLAG_RW | CTLFLAG_TUN, &maxssiz, 0, 131170620Sbms "Maximum stack size"); 132170620SbmsSYSCTL_ULONG(_kern, OID_AUTO, sgrowsiz, CTLFLAG_RW | CTLFLAG_TUN, &sgrowsiz, 0, 133170620Sbms "Amount to grow stack on a stack fault"); 134170620SbmsSYSCTL_PROC(_kern, OID_AUTO, vm_guest, CTLFLAG_RD | CTLTYPE_STRING, 135170620Sbms NULL, 0, sysctl_kern_vm_guest, "A", 136170620Sbms "Virtual machine guest detected? (none|generic|xen)"); 137170620Sbms 138170620Sbms/* 139170620Sbms * These have to be allocated somewhere; allocating 140170620Sbms * them here forces loader errors if this file is omitted 141170620Sbms * (if they've been externed everywhere else; hah!). 142170620Sbms */ 143170620Sbmsstruct buf *swbuf; 144170620Sbms 145170620Sbms/* 146170620Sbms * The elements of this array are ordered based upon the values of the 147170620Sbms * corresponding enum VM_GUEST members. 148170620Sbms */ 149170620Sbmsstatic const char *const vm_guest_sysctl_names[] = { 150170620Sbms "none", 151170620Sbms "generic", 152170620Sbms "xen", 153170620Sbms NULL 154170620Sbms}; 155170620Sbms 156170620Sbms#ifndef XEN 157170620Sbmsstatic const char *const vm_bnames[] = { 158170620Sbms "QEMU", /* QEMU */ 159170620Sbms "Plex86", /* Plex86 */ 160170620Sbms "Bochs", /* Bochs */ 161170620Sbms "Xen", /* Xen */ 162170620Sbms NULL 163170620Sbms}; 164170620Sbms 165170620Sbmsstatic const char *const vm_pnames[] = { 166170620Sbms "VMware Virtual Platform", /* VMWare VM */ 167170620Sbms "Virtual Machine", /* Microsoft VirtualPC */ 168170620Sbms "VirtualBox", /* Sun xVM VirtualBox */ 169170620Sbms "Parallels Virtual Platform", /* Parallels VM */ 170170620Sbms NULL 171170620Sbms}; 172170620Sbms 173170620Sbms 174170620Sbms/* 175170620Sbms * Detect known Virtual Machine hosts by inspecting the emulated BIOS. 176170620Sbms */ 177170620Sbmsstatic enum VM_GUEST 178170620Sbmsdetect_virtual(void) 179170620Sbms{ 180170620Sbms char *sysenv; 181170620Sbms int i; 182170620Sbms 183170620Sbms sysenv = getenv("smbios.bios.vendor"); 184170620Sbms if (sysenv != NULL) { 185170620Sbms for (i = 0; vm_bnames[i] != NULL; i++) 186170620Sbms if (strcmp(sysenv, vm_bnames[i]) == 0) { 187170620Sbms freeenv(sysenv); 188170620Sbms return (VM_GUEST_VM); 189170620Sbms } 190170620Sbms freeenv(sysenv); 191170620Sbms } 192170620Sbms sysenv = getenv("smbios.system.product"); 193170620Sbms if (sysenv != NULL) { 194170620Sbms for (i = 0; vm_pnames[i] != NULL; i++) 195170620Sbms if (strcmp(sysenv, vm_pnames[i]) == 0) { 196170620Sbms freeenv(sysenv); 197170620Sbms return (VM_GUEST_VM); 198170620Sbms } 199170620Sbms freeenv(sysenv); 200170620Sbms } 201170620Sbms return (VM_GUEST_NO); 202170620Sbms} 203170620Sbms#endif 204170620Sbms 205170620Sbms/* 206170620Sbms * Boot time overrides that are not scaled against main memory 207170620Sbms */ 208170620Sbmsvoid 209170620Sbmsinit_param1(void) 210170620Sbms{ 211170620Sbms#ifndef XEN 212170620Sbms vm_guest = detect_virtual(); 213170620Sbms#else 214170620Sbms vm_guest = VM_GUEST_XEN; 215170620Sbms#endif 216170620Sbms hz = -1; 217170620Sbms TUNABLE_INT_FETCH("kern.hz", &hz); 218170620Sbms if (hz == -1) 219170620Sbms hz = vm_guest > VM_GUEST_NO ? HZ_VM : HZ; 220170620Sbms tick = 1000000 / hz; 221170620Sbms 222170620Sbms#ifdef VM_SWZONE_SIZE_MAX 223170620Sbms maxswzone = VM_SWZONE_SIZE_MAX; 224170620Sbms#endif 225170620Sbms TUNABLE_LONG_FETCH("kern.maxswzone", &maxswzone); 226170620Sbms#ifdef VM_BCACHE_SIZE_MAX 227170620Sbms maxbcache = VM_BCACHE_SIZE_MAX; 228170620Sbms#endif 229170620Sbms TUNABLE_LONG_FETCH("kern.maxbcache", &maxbcache); 230170620Sbms msgbufsize = MSGBUF_SIZE; 231170620Sbms TUNABLE_INT_FETCH("kern.msgbufsize", &msgbufsize); 232170620Sbms 233170620Sbms maxtsiz = MAXTSIZ; 234170620Sbms TUNABLE_ULONG_FETCH("kern.maxtsiz", &maxtsiz); 235170620Sbms dfldsiz = DFLDSIZ; 236170620Sbms TUNABLE_ULONG_FETCH("kern.dfldsiz", &dfldsiz); 237170620Sbms maxdsiz = MAXDSIZ; 238170620Sbms TUNABLE_ULONG_FETCH("kern.maxdsiz", &maxdsiz); 239170620Sbms dflssiz = DFLSSIZ; 240170620Sbms TUNABLE_ULONG_FETCH("kern.dflssiz", &dflssiz); 241170620Sbms maxssiz = MAXSSIZ; 242170620Sbms TUNABLE_ULONG_FETCH("kern.maxssiz", &maxssiz); 243170620Sbms sgrowsiz = SGROWSIZ; 244170620Sbms TUNABLE_ULONG_FETCH("kern.sgrowsiz", &sgrowsiz); 245170620Sbms 246170620Sbms /* 247170620Sbms * Let the administrator set {NGROUPS_MAX}, but disallow values 248170620Sbms * less than NGROUPS_MAX which would violate POSIX.1-2008 or 249170620Sbms * greater than INT_MAX-1 which would result in overflow. 250170620Sbms */ 251170620Sbms ngroups_max = NGROUPS_MAX; 252170620Sbms TUNABLE_INT_FETCH("kern.ngroups", &ngroups_max); 253170620Sbms if (ngroups_max < NGROUPS_MAX) 254170620Sbms ngroups_max = NGROUPS_MAX; 255170620Sbms 256170620Sbms /* 257170620Sbms * Only allow to lower the maximal pid. 258170620Sbms * Prevent setting up a non-bootable system if pid_max is too low. 259170620Sbms */ 260170620Sbms TUNABLE_INT_FETCH("kern.pid_max", &pid_max); 261170620Sbms if (pid_max > PID_MAX) 262170620Sbms pid_max = PID_MAX; 263170620Sbms else if (pid_max < 300) 264170620Sbms pid_max = 300; 265170620Sbms} 266170620Sbms 267170620Sbms/* 268170620Sbms * Boot time overrides that are scaled against main memory 269170620Sbms */ 270170620Sbmsvoid 271170620Sbmsinit_param2(long physpages) 272170620Sbms{ 273170620Sbms 274170620Sbms /* Base parameters */ 275170620Sbms maxusers = MAXUSERS; 276170620Sbms TUNABLE_INT_FETCH("kern.maxusers", &maxusers); 277170620Sbms if (maxusers == 0) { 278170620Sbms maxusers = physpages / (2 * 1024 * 1024 / PAGE_SIZE); 279170620Sbms if (maxusers < 32) 280170620Sbms maxusers = 32; 281170620Sbms if (maxusers > 384) 282170620Sbms maxusers = 384; 283170620Sbms } 284170620Sbms 285170620Sbms /* 286170620Sbms * The following can be overridden after boot via sysctl. Note: 287170620Sbms * unless overriden, these macros are ultimately based on maxusers. 288170620Sbms */ 289170620Sbms maxproc = NPROC; 290170620Sbms TUNABLE_INT_FETCH("kern.maxproc", &maxproc); 291170620Sbms /* 292170620Sbms * Limit maxproc so that kmap entries cannot be exhausted by 293170620Sbms * processes. 294170620Sbms */ 295170620Sbms if (maxproc > (physpages / 12)) 296170620Sbms maxproc = physpages / 12; 297170620Sbms maxfiles = MAXFILES; 298170620Sbms TUNABLE_INT_FETCH("kern.maxfiles", &maxfiles); 299170620Sbms maxprocperuid = (maxproc * 9) / 10; 300170620Sbms maxfilesperproc = (maxfiles * 9) / 10; 301170620Sbms 302170620Sbms /* 303170620Sbms * Cannot be changed after boot. 304170620Sbms */ 305170620Sbms nbuf = NBUF; 306170625Sbms TUNABLE_INT_FETCH("kern.nbuf", &nbuf); 307170620Sbms 308170620Sbms ncallout = 16 + maxproc + maxfiles; 309170620Sbms TUNABLE_INT_FETCH("kern.ncallout", &ncallout); 310170620Sbms 311170620Sbms /* 312170620Sbms * The default for maxpipekva is min(1/64 of the kernel address space, 313170620Sbms * max(1/64 of main memory, 512KB)). See sys_pipe.c for more details. 314170620Sbms */ 315170620Sbms maxpipekva = (physpages / 64) * PAGE_SIZE; 316170620Sbms if (maxpipekva < 512 * 1024) 317170620Sbms maxpipekva = 512 * 1024; 318170620Sbms if (maxpipekva > (VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS) / 64) 319170620Sbms maxpipekva = (VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS) / 320170620Sbms 64; 321170620Sbms TUNABLE_LONG_FETCH("kern.ipc.maxpipekva", &maxpipekva); 322170620Sbms} 323170620Sbms 324170620Sbms/* 325170620Sbms * Sysctl stringiying handler for kern.vm_guest. 326171197Speter */ 327170620Sbmsstatic int 328170620Sbmssysctl_kern_vm_guest(SYSCTL_HANDLER_ARGS) 329170620Sbms{ 330170620Sbms return (SYSCTL_OUT(req, vm_guest_sysctl_names[vm_guest], 331170620Sbms strlen(vm_guest_sysctl_names[vm_guest]))); 332170620Sbms} 333170620Sbms