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