xref: /illumos-gate/usr/src/uts/common/sys/vmsystm.h (revision fc1821fee2e1f208a4b5ff3e229e97b87979208a)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*	Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T	*/
28 /*	  All Rights Reserved  	*/
29 
30 /*
31  * University Copyright- Copyright (c) 1982, 1986, 1988
32  * The Regents of the University of California
33  * All Rights Reserved
34  *
35  * University Acknowledgment- Portions of this document are derived from
36  * software developed by the University of California, Berkeley, and its
37  * contributors.
38  */
39 
40 #ifndef _SYS_VMSYSTM_H
41 #define	_SYS_VMSYSTM_H
42 
43 #pragma ident	"%Z%%M%	%I%	%E% SMI"
44 
45 #include <sys/proc.h>
46 
47 #ifdef	__cplusplus
48 extern "C" {
49 #endif
50 
51 /*
52  * Miscellaneous virtual memory subsystem variables and structures.
53  */
54 #ifdef _KERNEL
55 extern pgcnt_t	freemem;	/* remaining blocks of free memory */
56 extern pgcnt_t	avefree;	/* 5 sec moving average of free memory */
57 extern pgcnt_t	avefree30;	/* 30 sec moving average of free memory */
58 extern pgcnt_t	deficit;	/* estimate of needs of new swapped in procs */
59 extern pgcnt_t	nscan;		/* number of scans in last second */
60 extern pgcnt_t	desscan;	/* desired pages scanned per second */
61 extern pgcnt_t	slowscan;
62 extern pgcnt_t	fastscan;
63 extern pgcnt_t	pushes;		/* number of pages pushed to swap device */
64 
65 /* writable copies of tunables */
66 extern pgcnt_t	maxpgio;	/* max paging i/o per sec before start swaps */
67 extern pgcnt_t	lotsfree;	/* max free before clock freezes */
68 extern pgcnt_t	desfree;	/* minimum free pages before swapping begins */
69 extern pgcnt_t	minfree;	/* no of pages to try to keep free via daemon */
70 extern pgcnt_t	needfree;	/* no of pages currently being waited for */
71 extern pgcnt_t	throttlefree;	/* point at which we block PG_WAIT calls */
72 extern pgcnt_t	pageout_reserve; /* point at which we deny non-PG_WAIT calls */
73 extern pgcnt_t	pages_before_pager; /* XXX */
74 
75 /*
76  * TRUE if the pageout daemon, fsflush daemon or the scheduler.  These
77  * processes can't sleep while trying to free up memory since a deadlock
78  * will occur if they do sleep.
79  */
80 #define	NOMEMWAIT() (ttoproc(curthread) == proc_pageout || \
81 			ttoproc(curthread) == proc_fsflush || \
82 			ttoproc(curthread) == proc_sched)
83 
84 /* insure non-zero */
85 #define	nz(x)	((x) != 0 ? (x) : 1)
86 
87 /*
88  * Flags passed by the swapper to swapout routines of each
89  * scheduling class.
90  */
91 #define	HARDSWAP	1
92 #define	SOFTSWAP	2
93 
94 /*
95  * Values returned by valid_usr_range()
96  */
97 #define	RANGE_OKAY	(0)
98 #define	RANGE_BADADDR	(1)
99 #define	RANGE_BADPROT	(2)
100 
101 /*
102  * map_pgsz: temporary - subject to change.
103  */
104 #define	MAPPGSZ_VA	0x01
105 #define	MAPPGSZ_STK	0x02
106 #define	MAPPGSZ_HEAP	0x04
107 #define	MAPPGSZ_ISM	0x08
108 
109 struct as;
110 struct page;
111 struct anon;
112 
113 extern int maxslp;
114 extern ulong_t pginrate;
115 extern ulong_t pgoutrate;
116 extern void swapout_lwp(klwp_t *);
117 
118 extern	int valid_va_range(caddr_t *basep, size_t *lenp, size_t minlen,
119 		int dir);
120 extern	int valid_usr_range(caddr_t, size_t, uint_t, struct as *, caddr_t);
121 extern	int useracc(void *, size_t, int);
122 extern	size_t map_pgsz(int maptype, struct proc *p, caddr_t addr,
123 		size_t len, int *remap);
124 extern	uint_t map_execseg_pgszcvec(int, caddr_t, size_t);
125 extern	void map_addr(caddr_t *addrp, size_t len, offset_t off, int vacalign,
126     uint_t flags);
127 extern	int map_addr_vacalign_check(caddr_t, u_offset_t);
128 extern	void map_addr_proc(caddr_t *addrp, size_t len, offset_t off,
129     int vacalign, caddr_t userlimit, struct proc *p, uint_t flags);
130 extern	void vmmeter(void);
131 extern	int cow_mapin(struct as *, caddr_t, caddr_t, struct page **,
132 	struct anon **, size_t *, int);
133 
134 extern	caddr_t	ppmapin(struct page *, uint_t, caddr_t);
135 extern	void	ppmapout(caddr_t);
136 
137 extern	int pf_is_memory(pfn_t);
138 extern	void	pageout_init(void (*proc)(), proc_t *pp, pri_t pri);
139 
140 extern	void	dcache_flushall(void);
141 
142 extern	void	*boot_virt_alloc(void *addr, size_t size);
143 
144 #endif	/* _KERNEL */
145 
146 #ifdef	__cplusplus
147 }
148 #endif
149 
150 #endif	/* _SYS_VMSYSTM_H */
151