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