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