FreeBSD kernel kern code
subr_param.c
Go to the documentation of this file.
1 /*-
2  * Copyright (c) 1980, 1986, 1989, 1993
3  * The Regents of the University of California. All rights reserved.
4  * (c) UNIX System Laboratories, Inc.
5  * All or some portions of this file are derived from material licensed
6  * to the University of California by American Telephone and Telegraph
7  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
8  * the permission of UNIX System Laboratories, Inc.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  * notice, this list of conditions and the following disclaimer in the
17  * documentation and/or other materials provided with the distribution.
18  * 4. Neither the name of the University nor the names of its contributors
19  * may be used to endorse or promote products derived from this software
20  * without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  *
34  * @(#)param.c 8.3 (Berkeley) 8/20/94
35  */
36 
37 #include <sys/cdefs.h>
38 __FBSDID("$BSDSUniX$");
39 
40 #include "opt_param.h"
41 #include "opt_msgbuf.h"
42 #include "opt_maxusers.h"
43 
44 #include <sys/param.h>
45 #include <sys/systm.h>
46 #include <sys/kernel.h>
47 #include <sys/limits.h>
48 #include <sys/msgbuf.h>
49 #include <sys/sysctl.h>
50 #include <sys/proc.h>
51 
52 #include <vm/vm.h>
53 #include <vm/vm_param.h>
54 #include <vm/pmap.h>
55 
56 /*
57  * System parameter formulae.
58  */
59 
60 #ifndef HZ
61 # if defined(__mips__) || defined(__arm__)
62 # define HZ 100
63 # else
64 # define HZ 1000
65 # endif
66 # ifndef HZ_VM
67 # define HZ_VM 100
68 # endif
69 #else
70 # ifndef HZ_VM
71 # define HZ_VM HZ
72 # endif
73 #endif
74 #define NPROC (20 + 16 * maxusers)
75 #ifndef NBUF
76 #define NBUF 0
77 #endif
78 #ifndef MAXFILES
79 #define MAXFILES (maxproc * 2)
80 #endif
81 
82 static int sysctl_kern_vm_guest(SYSCTL_HANDLER_ARGS);
83 
84 int hz;
85 int tick;
86 int maxusers; /* base tunable */
87 int maxproc; /* maximum # of processes */
88 int maxprocperuid; /* max # of procs per user */
89 int maxfiles; /* sys. wide open files limit */
90 int maxfilesperproc; /* per-proc open files limit */
91 int msgbufsize; /* size of kernel message buffer */
92 int ncallout; /* maximum # of timer events */
93 int nbuf;
95 int ngroups_max; /* max # groups per process */
96 int nswbuf;
97 pid_t pid_max = PID_MAX;
98 long maxswzone; /* max swmeta KVA storage */
99 long maxbcache; /* max buffer cache KVA storage */
100 long maxpipekva; /* Limit on pipe KVA */
101 int vm_guest; /* Running as virtual machine guest? */
102 u_long maxtsiz; /* max text size */
103 u_long dfldsiz; /* initial data size limit */
104 u_long maxdsiz; /* max data size */
105 u_long dflssiz; /* initial stack size limit */
106 u_long maxssiz; /* max stack size */
107 u_long sgrowsiz; /* amount to grow stack */
108 
109 SYSCTL_INT(_kern, OID_AUTO, hz, CTLFLAG_RDTUN, &hz, 0,
110  "Number of clock ticks per second");
111 SYSCTL_INT(_kern, OID_AUTO, ncallout, CTLFLAG_RDTUN, &ncallout, 0,
112  "Number of pre-allocated timer events");
113 SYSCTL_INT(_kern, OID_AUTO, nbuf, CTLFLAG_RDTUN, &nbuf, 0,
114  "Number of buffers in the buffer cache");
115 SYSCTL_INT(_kern, OID_AUTO, nswbuf, CTLFLAG_RDTUN, &nswbuf, 0,
116  "Number of swap buffers");
117 SYSCTL_INT(_kern, OID_AUTO, msgbufsize, CTLFLAG_RDTUN, &msgbufsize, 0,
118  "Size of the kernel message buffer");
119 SYSCTL_LONG(_kern, OID_AUTO, maxswzone, CTLFLAG_RDTUN, &maxswzone, 0,
120  "Maximum memory for swap metadata");
121 SYSCTL_LONG(_kern, OID_AUTO, maxbcache, CTLFLAG_RDTUN, &maxbcache, 0,
122  "Maximum value of vfs.maxbufspace");
123 SYSCTL_INT(_kern, OID_AUTO, bio_transient_maxcnt, CTLFLAG_RDTUN,
125  "Maximum number of transient BIOs mappings");
126 SYSCTL_ULONG(_kern, OID_AUTO, maxtsiz, CTLFLAG_RW | CTLFLAG_TUN, &maxtsiz, 0,
127  "Maximum text size");
128 SYSCTL_ULONG(_kern, OID_AUTO, dfldsiz, CTLFLAG_RW | CTLFLAG_TUN, &dfldsiz, 0,
129  "Initial data size limit");
130 SYSCTL_ULONG(_kern, OID_AUTO, maxdsiz, CTLFLAG_RW | CTLFLAG_TUN, &maxdsiz, 0,
131  "Maximum data size");
132 SYSCTL_ULONG(_kern, OID_AUTO, dflssiz, CTLFLAG_RW | CTLFLAG_TUN, &dflssiz, 0,
133  "Initial stack size limit");
134 SYSCTL_ULONG(_kern, OID_AUTO, maxssiz, CTLFLAG_RW | CTLFLAG_TUN, &maxssiz, 0,
135  "Maximum stack size");
136 SYSCTL_ULONG(_kern, OID_AUTO, sgrowsiz, CTLFLAG_RW | CTLFLAG_TUN, &sgrowsiz, 0,
137  "Amount to grow stack on a stack fault");
138 SYSCTL_PROC(_kern, OID_AUTO, vm_guest, CTLFLAG_RD | CTLTYPE_STRING,
139  NULL, 0, sysctl_kern_vm_guest, "A",
140  "Virtual machine guest detected? (none|generic|xen)");
141 
142 /*
143  * These have to be allocated somewhere; allocating
144  * them here forces loader errors if this file is omitted
145  * (if they've been externed everywhere else; hah!).
146  */
147 struct buf *swbuf;
148 
149 /*
150  * The elements of this array are ordered based upon the values of the
151  * corresponding enum VM_GUEST members.
152  */
153 static const char *const vm_guest_sysctl_names[] = {
154  "none",
155  "generic",
156  "xen",
157  NULL
158 };
159 
160 #ifndef XEN
161 static const char *const vm_bnames[] = {
162  "QEMU", /* QEMU */
163  "Plex86", /* Plex86 */
164  "Bochs", /* Bochs */
165  "Xen", /* Xen */
166  "BHYVE", /* bhyve */
167  "Seabios", /* KVM */
168  NULL
169 };
170 
171 static const char *const vm_pnames[] = {
172  "VMware Virtual Platform", /* VMWare VM */
173  "Virtual Machine", /* Microsoft VirtualPC */
174  "VirtualBox", /* Sun xVM VirtualBox */
175  "Parallels Virtual Platform", /* Parallels VM */
176  "KVM", /* KVM */
177  NULL
178 };
179 
180 
181 /*
182  * Detect known Virtual Machine hosts by inspecting the emulated BIOS.
183  */
184 static enum VM_GUEST
186 {
187  char *sysenv;
188  int i;
189 
190  sysenv = getenv("smbios.bios.vendor");
191  if (sysenv != NULL) {
192  for (i = 0; vm_bnames[i] != NULL; i++)
193  if (strcmp(sysenv, vm_bnames[i]) == 0) {
194  freeenv(sysenv);
195  return (VM_GUEST_VM);
196  }
197  freeenv(sysenv);
198  }
199  sysenv = getenv("smbios.system.product");
200  if (sysenv != NULL) {
201  for (i = 0; vm_pnames[i] != NULL; i++)
202  if (strcmp(sysenv, vm_pnames[i]) == 0) {
203  freeenv(sysenv);
204  return (VM_GUEST_VM);
205  }
206  freeenv(sysenv);
207  }
208  return (VM_GUEST_NO);
209 }
210 #endif
211 
212 /*
213  * Boot time overrides that are not scaled against main memory
214  */
215 void
217 {
218 #ifndef XEN
220 #else
221  vm_guest = VM_GUEST_XEN;
222 #endif
223  hz = -1;
224  TUNABLE_INT_FETCH("kern.hz", &hz);
225  if (hz == -1)
226  hz = vm_guest > VM_GUEST_NO ? HZ_VM : HZ;
227  tick = 1000000 / hz;
228 
229 #ifdef VM_SWZONE_SIZE_MAX
230  maxswzone = VM_SWZONE_SIZE_MAX;
231 #endif
232  TUNABLE_LONG_FETCH("kern.maxswzone", &maxswzone);
233 #ifdef VM_BCACHE_SIZE_MAX
234  maxbcache = VM_BCACHE_SIZE_MAX;
235 #endif
236  TUNABLE_LONG_FETCH("kern.maxbcache", &maxbcache);
237  msgbufsize = MSGBUF_SIZE;
238  TUNABLE_INT_FETCH("kern.msgbufsize", &msgbufsize);
239 
240  maxtsiz = MAXTSIZ;
241  TUNABLE_ULONG_FETCH("kern.maxtsiz", &maxtsiz);
242  dfldsiz = DFLDSIZ;
243  TUNABLE_ULONG_FETCH("kern.dfldsiz", &dfldsiz);
244  maxdsiz = MAXDSIZ;
245  TUNABLE_ULONG_FETCH("kern.maxdsiz", &maxdsiz);
246  dflssiz = DFLSSIZ;
247  TUNABLE_ULONG_FETCH("kern.dflssiz", &dflssiz);
248  maxssiz = MAXSSIZ;
249  TUNABLE_ULONG_FETCH("kern.maxssiz", &maxssiz);
250  sgrowsiz = SGROWSIZ;
251  TUNABLE_ULONG_FETCH("kern.sgrowsiz", &sgrowsiz);
252 
253  /*
254  * Let the administrator set {NGROUPS_MAX}, but disallow values
255  * less than NGROUPS_MAX which would violate POSIX.1-2008 or
256  * greater than INT_MAX-1 which would result in overflow.
257  */
258  ngroups_max = NGROUPS_MAX;
259  TUNABLE_INT_FETCH("kern.ngroups", &ngroups_max);
260  if (ngroups_max < NGROUPS_MAX)
261  ngroups_max = NGROUPS_MAX;
262 
263  /*
264  * Only allow to lower the maximal pid.
265  * Prevent setting up a non-bootable system if pid_max is too low.
266  */
267  TUNABLE_INT_FETCH("kern.pid_max", &pid_max);
268  if (pid_max > PID_MAX)
269  pid_max = PID_MAX;
270  else if (pid_max < 300)
271  pid_max = 300;
272 
273  TUNABLE_INT_FETCH("vfs.unmapped_buf_allowed", &unmapped_buf_allowed);
274 }
275 
276 /*
277  * Boot time overrides that are scaled against main memory
278  */
279 void
280 init_param2(long physpages)
281 {
282 
283  /* Base parameters */
284  maxusers = MAXUSERS;
285  TUNABLE_INT_FETCH("kern.maxusers", &maxusers);
286  if (maxusers == 0) {
287  maxusers = physpages / (2 * 1024 * 1024 / PAGE_SIZE);
288  if (maxusers < 32)
289  maxusers = 32;
290 #ifdef VM_MAX_AUTOTUNE_MAXUSERS
291  if (maxusers > VM_MAX_AUTOTUNE_MAXUSERS)
292  maxusers = VM_MAX_AUTOTUNE_MAXUSERS;
293 #endif
294  /*
295  * Scales down the function in which maxusers grows once
296  * we hit 384.
297  */
298  if (maxusers > 384)
299  maxusers = 384 + ((maxusers - 384) / 8);
300  }
301 
302  /*
303  * The following can be overridden after boot via sysctl. Note:
304  * unless overriden, these macros are ultimately based on maxusers.
305  * Limit maxproc so that kmap entries cannot be exhausted by
306  * processes.
307  */
308  maxproc = NPROC;
309  TUNABLE_INT_FETCH("kern.maxproc", &maxproc);
310  if (maxproc > (physpages / 12))
311  maxproc = physpages / 12;
312  maxprocperuid = (maxproc * 9) / 10;
313 
314  /*
315  * The default limit for maxfiles is 1/12 of the number of
316  * physical page but not less than 16 times maxusers.
317  * At most it can be 1/6 the number of physical pages.
318  */
319  maxfiles = imax(MAXFILES, physpages / 8);
320  TUNABLE_INT_FETCH("kern.maxfiles", &maxfiles);
321  if (maxfiles > (physpages / 4))
322  maxfiles = physpages / 4;
323  maxfilesperproc = (maxfiles / 10) * 9;
324 
325  /*
326  * Cannot be changed after boot.
327  */
328  nbuf = NBUF;
329  TUNABLE_INT_FETCH("kern.nbuf", &nbuf);
330  TUNABLE_INT_FETCH("kern.bio_transient_maxcnt", &bio_transient_maxcnt);
331 
332  /*
333  * XXX: Does the callout wheel have to be so big?
334  *
335  * Clip callout to result of previous function of maxusers maximum
336  * 384. This is still huge, but acceptable.
337  */
338  ncallout = imin(16 + maxproc + maxfiles, 18508);
339  TUNABLE_INT_FETCH("kern.ncallout", &ncallout);
340 
341  /*
342  * The default for maxpipekva is min(1/64 of the kernel address space,
343  * max(1/64 of main memory, 512KB)). See sys_pipe.c for more details.
344  */
345  maxpipekva = (physpages / 64) * PAGE_SIZE;
346  TUNABLE_LONG_FETCH("kern.ipc.maxpipekva", &maxpipekva);
347  if (maxpipekva < 512 * 1024)
348  maxpipekva = 512 * 1024;
349  if (maxpipekva > (VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS) / 64)
350  maxpipekva = (VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS) /
351  64;
352 }
353 
354 /*
355  * Sysctl stringifying handler for kern.vm_guest.
356  */
357 static int
358 sysctl_kern_vm_guest(SYSCTL_HANDLER_ARGS)
359 {
360  return (SYSCTL_OUT(req, vm_guest_sysctl_names[vm_guest],
361  strlen(vm_guest_sysctl_names[vm_guest])));
362 }
int maxfilesperproc
Definition: subr_param.c:90
static const char *const vm_pnames[]
Definition: subr_param.c:171
struct buf * buf
Definition: vfs_bio.c:97
pid_t pid_max
Definition: subr_param.c:97
void init_param1(void)
Definition: subr_param.c:216
SYSCTL_LONG(_kern, OID_AUTO, maxswzone, CTLFLAG_RDTUN,&maxswzone, 0,"Maximum memory for swap metadata")
#define NBUF
Definition: subr_param.c:76
int nswbuf
Definition: subr_param.c:96
u_long maxtsiz
Definition: subr_param.c:102
SYSCTL_ULONG(_kern, OID_AUTO, maxtsiz, CTLFLAG_RW|CTLFLAG_TUN,&maxtsiz, 0,"Maximum text size")
int vm_guest
Definition: subr_param.c:101
__FBSDID("$BSDSUniX$")
int maxusers
Definition: subr_param.c:86
struct buf * swbuf
Definition: subr_param.c:147
void freeenv(char *env)
u_long maxdsiz
Definition: subr_param.c:104
static enum VM_GUEST detect_virtual(void)
Definition: subr_param.c:185
int maxproc
Definition: subr_param.c:87
int nbuf
Definition: subr_param.c:93
SYSCTL_PROC(_kern, OID_AUTO, vm_guest, CTLFLAG_RD|CTLTYPE_STRING, NULL, 0, sysctl_kern_vm_guest,"A","Virtual machine guest detected? (none|generic|xen)")
#define HZ_VM
Definition: subr_param.c:67
#define HZ
Definition: subr_param.c:64
long maxswzone
Definition: subr_param.c:98
#define NPROC
Definition: subr_param.c:74
int maxfiles
Definition: subr_param.c:89
SYSCTL_INT(_kern, OID_AUTO, hz, CTLFLAG_RDTUN,&hz, 0,"Number of clock ticks per second")
int maxprocperuid
Definition: subr_param.c:88
u_long maxssiz
Definition: subr_param.c:106
int ngroups_max
Definition: subr_param.c:95
static const char *const vm_bnames[]
Definition: subr_param.c:161
char * getenv(const char *name)
u_long dfldsiz
Definition: subr_param.c:103
u_long sgrowsiz
Definition: subr_param.c:107
int ncallout
Definition: subr_param.c:92
int bio_transient_maxcnt
Definition: subr_param.c:94
#define MAXFILES
Definition: subr_param.c:79
int msgbufsize
Definition: subr_param.c:91
long maxpipekva
Definition: subr_param.c:100
long maxbcache
Definition: subr_param.c:99
void init_param2(long physpages)
Definition: subr_param.c:280
static const char *const vm_guest_sysctl_names[]
Definition: subr_param.c:153
u_long dflssiz
Definition: subr_param.c:105
int tick
Definition: subr_param.c:85
static int sysctl_kern_vm_guest(SYSCTL_HANDLER_ARGS)
Definition: subr_param.c:358
int hz
Definition: subr_param.c:84