subr_param.c revision 138214
139830Speter/*
239830Speter * Copyright (c) 1980, 1986, 1989, 1993
339830Speter *	The Regents of the University of California.  All rights reserved.
439830Speter * (c) UNIX System Laboratories, Inc.
539830Speter * All or some portions of this file are derived from material licensed
639830Speter * to the University of California by American Telephone and Telegraph
739830Speter * Co. or Unix System Laboratories, Inc. and are reproduced herein with
839830Speter * the permission of UNIX System Laboratories, Inc.
939830Speter *
1039830Speter * Redistribution and use in source and binary forms, with or without
1139830Speter * modification, are permitted provided that the following conditions
1239830Speter * are met:
1339830Speter * 1. Redistributions of source code must retain the above copyright
1439830Speter *    notice, this list of conditions and the following disclaimer.
1539830Speter * 2. Redistributions in binary form must reproduce the above copyright
1639830Speter *    notice, this list of conditions and the following disclaimer in the
1739830Speter *    documentation and/or other materials provided with the distribution.
1839830Speter * 4. Neither the name of the University nor the names of its contributors
1939830Speter *    may be used to endorse or promote products derived from this software
2039830Speter *    without specific prior written permission.
2139830Speter *
2239830Speter * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2339830Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2439830Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2539830Speter * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2639830Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2740254Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2839830Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2939830Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3039830Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3139830Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3239830Speter * SUCH DAMAGE.
3340143Speter *
3439830Speter *	@(#)param.c	8.3 (Berkeley) 8/20/94
3539830Speter */
3639830Speter
3739830Speter#include <sys/cdefs.h>
3839830Speter__FBSDID("$FreeBSD: head/sys/kern/subr_param.c 138214 2004-11-30 03:23:35Z bms $");
3939830Speter
4039830Speter#include "opt_param.h"
4139830Speter#include "opt_maxusers.h"
4239830Speter
4340143Speter#include <sys/param.h>
4439830Speter#include <sys/systm.h>
4539830Speter#include <sys/kernel.h>
4639830Speter
4739830Speter#include <vm/vm_param.h>
4839830Speter
4939830Speter/*
5039830Speter * System parameter formulae.
5139830Speter */
5239830Speter
5339830Speter#ifndef HZ
5439830Speter#  if defined(__amd64__) || defined(__i386__) || defined(__ia64__)
5539830Speter#    define	HZ 1000
5639830Speter#  else
5739830Speter#    define	HZ 100
5839830Speter#  endif
5939830Speter#endif
6039830Speter#define	NPROC (20 + 16 * maxusers)
6140143Speter#ifndef NBUF
6239830Speter#define NBUF 0
6339830Speter#endif
6439830Speter#ifndef MAXFILES
6539830Speter#define	MAXFILES (maxproc * 2)
6639830Speter#endif
6739830Speter
6839830Speterint	hz;
6939830Speterint	tick;
7039830Speterint	maxusers;			/* base tunable */
7139830Speterint	maxproc;			/* maximum # of processes */
7239830Speterint	maxprocperuid;			/* max # of procs per user */
7339830Speterint	maxfiles;			/* sys. wide open files limit */
7439830Speterint	maxfilesperproc;		/* per-proc open files limit */
7539830Speterint	ncallout;			/* maximum # of timer events */
7639830Speterint	nbuf;
7739830Speterint	nswbuf;
7839830Speterlong	maxswzone;			/* max swmeta KVA storage */
7939830Speterlong	maxbcache;			/* max buffer cache KVA storage */
8039830Speterint	maxpipekva;			/* Limit on pipe KVA */
8139830Speteru_long	maxtsiz;			/* max text size */
8239830Speteru_long	dfldsiz;			/* initial data size limit */
8339830Speteru_long	maxdsiz;			/* max data size */
8439830Speteru_long	dflssiz;			/* initial stack size limit */
8539830Speteru_long	maxssiz;			/* max stack size */
8639830Speteru_long	sgrowsiz;			/* amount to grow stack */
8739830Speter
8839830Speter/*
8939830Speter * These have to be allocated somewhere; allocating
9039830Speter * them here forces loader errors if this file is omitted
9139830Speter * (if they've been externed everywhere else; hah!).
9239830Speter */
9339830Speterstruct	buf *swbuf;
9439830Speter
9539830Speter/*
9639830Speter * Boot time overrides that are not scaled against main memory
9739830Speter */
9839830Spetervoid
9939830Speterinit_param1(void)
10039830Speter{
10139830Speter
10239830Speter	hz = HZ;
10339830Speter	TUNABLE_INT_FETCH("kern.hz", &hz);
10439830Speter	tick = 1000000 / hz;
10539830Speter
10639830Speter#ifdef VM_SWZONE_SIZE_MAX
10739830Speter	maxswzone = VM_SWZONE_SIZE_MAX;
10839830Speter#endif
10939830Speter	TUNABLE_LONG_FETCH("kern.maxswzone", &maxswzone);
11039830Speter#ifdef VM_BCACHE_SIZE_MAX
11139830Speter	maxbcache = VM_BCACHE_SIZE_MAX;
11240143Speter#endif
11339830Speter	TUNABLE_LONG_FETCH("kern.maxbcache", &maxbcache);
11439830Speter
11540143Speter	maxtsiz = MAXTSIZ;
11639830Speter	TUNABLE_ULONG_FETCH("kern.maxtsiz", &maxtsiz);
11739830Speter	dfldsiz = DFLDSIZ;
11839830Speter	TUNABLE_ULONG_FETCH("kern.dfldsiz", &dfldsiz);
11939830Speter	maxdsiz = MAXDSIZ;
12039830Speter	TUNABLE_ULONG_FETCH("kern.maxdsiz", &maxdsiz);
12139830Speter	dflssiz = DFLSSIZ;
12239830Speter	TUNABLE_ULONG_FETCH("kern.dflssiz", &dflssiz);
12339830Speter	maxssiz = MAXSSIZ;
12439830Speter	TUNABLE_ULONG_FETCH("kern.maxssiz", &maxssiz);
12539830Speter	sgrowsiz = SGROWSIZ;
12639830Speter	TUNABLE_ULONG_FETCH("kern.sgrowsiz", &sgrowsiz);
12739830Speter}
12839830Speter
12939830Speter/*
13039830Speter * Boot time overrides that are scaled against main memory
13139830Speter */
13239830Spetervoid
13339830Speterinit_param2(long physpages)
13439830Speter{
13539830Speter
13639830Speter	/* Base parameters */
13739830Speter	maxusers = MAXUSERS;
13839830Speter	TUNABLE_INT_FETCH("kern.maxusers", &maxusers);
13939830Speter	if (maxusers == 0) {
14039830Speter		maxusers = physpages / (2 * 1024 * 1024 / PAGE_SIZE);
14139830Speter		if (maxusers < 32)
14239830Speter			maxusers = 32;
14339830Speter		if (maxusers > 384)
14440143Speter			maxusers = 384;
14540143Speter	}
14640143Speter
14740143Speter	/*
14840143Speter	 * The following can be overridden after boot via sysctl.  Note:
14939830Speter	 * unless overriden, these macros are ultimately based on maxusers.
15040143Speter	 */
15140143Speter	maxproc = NPROC;
15240143Speter	TUNABLE_INT_FETCH("kern.maxproc", &maxproc);
15340143Speter	/*
15440143Speter	 * Limit maxproc so that kmap entries cannot be exhausted by
15540143Speter	 * processes.
15639830Speter	 */
15739830Speter	if (maxproc > (physpages / 12))
15840254Speter		maxproc = physpages / 12;
15940254Speter	maxfiles = MAXFILES;
16039830Speter	TUNABLE_INT_FETCH("kern.maxfiles", &maxfiles);
16140143Speter	maxprocperuid = (maxproc * 9) / 10;
16240143Speter	maxfilesperproc = (maxfiles * 9) / 10;
16339830Speter
16439830Speter	/*
16539830Speter	 * Cannot be changed after boot.
16639830Speter	 */
16739830Speter	nbuf = NBUF;
16839830Speter	TUNABLE_INT_FETCH("kern.nbuf", &nbuf);
16939830Speter
17039830Speter	ncallout = 16 + maxproc + maxfiles;
17139830Speter	TUNABLE_INT_FETCH("kern.ncallout", &ncallout);
17239830Speter}
17339830Speter
17439830Speter/*
17539830Speter * Boot time overrides that are scaled against the kernel map
17639830Speter */
17739830Spetervoid
17839830Speterinit_param3(long kmempages)
17939830Speter{
18039830Speter
18139830Speter	/*
18239830Speter	 * The default for maxpipekva is max(5% of the kernel map, 512KB).
18339830Speter	 * See sys_pipe.c for more details.
18440143Speter	 */
18539830Speter	maxpipekva = (kmempages / 20) * PAGE_SIZE;
18639830Speter	if (maxpipekva < 512 * 1024)
18740143Speter		maxpipekva = 512 * 1024;
18839887Speter	TUNABLE_INT_FETCH("kern.ipc.maxpipekva", &maxpipekva);
18939830Speter}
19039887Speter