vm_pager.h revision 1542
1204076Spjd/*
2204076Spjd * Copyright (c) 1990 University of Utah.
3219351Spjd * Copyright (c) 1991, 1993
4204076Spjd *	The Regents of the University of California.  All rights reserved.
5204076Spjd *
6204076Spjd * This code is derived from software contributed to Berkeley by
7204076Spjd * the Systems Programming Group of the University of Utah Computer
8204076Spjd * Science Department.
9204076Spjd *
10204076Spjd * Redistribution and use in source and binary forms, with or without
11204076Spjd * modification, are permitted provided that the following conditions
12204076Spjd * are met:
13204076Spjd * 1. Redistributions of source code must retain the above copyright
14204076Spjd *    notice, this list of conditions and the following disclaimer.
15204076Spjd * 2. Redistributions in binary form must reproduce the above copyright
16204076Spjd *    notice, this list of conditions and the following disclaimer in the
17204076Spjd *    documentation and/or other materials provided with the distribution.
18204076Spjd * 3. All advertising materials mentioning features or use of this software
19204076Spjd *    must display the following acknowledgement:
20204076Spjd *	This product includes software developed by the University of
21204076Spjd *	California, Berkeley and its contributors.
22204076Spjd * 4. Neither the name of the University nor the names of its contributors
23204076Spjd *    may be used to endorse or promote products derived from this software
24204076Spjd *    without specific prior written permission.
25204076Spjd *
26204076Spjd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27204076Spjd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28204076Spjd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29204076Spjd * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30204076Spjd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31204076Spjd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32204076Spjd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33204076Spjd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34204076Spjd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35204076Spjd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36204076Spjd * SUCH DAMAGE.
37204076Spjd *
38204076Spjd *	@(#)vm_pager.h	8.4 (Berkeley) 1/12/94
39204076Spjd */
40204076Spjd
41204076Spjd/*
42204076Spjd * Pager routine interface definition.
43204076Spjd * For BSD we use a cleaner version of the internal pager interface.
44204076Spjd */
45204076Spjd
46204076Spjd#ifndef	_VM_PAGER_
47204076Spjd#define	_VM_PAGER_
48211982Spjd
49204076SpjdTAILQ_HEAD(pagerlst, pager_struct);
50204076Spjd
51204076Spjdstruct	pager_struct {
52204076Spjd	TAILQ_ENTRY(pager_struct) pg_list;	/* links for list management */
53204076Spjd	caddr_t			  pg_handle;	/* ext. handle (vp, dev, fp) */
54204076Spjd	int			  pg_type;	/* type of pager */
55204076Spjd	int			  pg_flags;	/* flags */
56204076Spjd	struct pagerops		  *pg_ops;	/* pager operations */
57204076Spjd	void			  *pg_data;	/* private pager data */
58204076Spjd};
59204076Spjd
60212038Spjd/* pager types */
61204076Spjd#define PG_DFLT		-1
62204076Spjd#define	PG_SWAP		0
63204076Spjd#define	PG_VNODE	1
64211886Spjd#define PG_DEVICE	2
65204076Spjd
66204076Spjd/* flags */
67204076Spjd#define PG_CLUSTERGET	1
68204076Spjd#define PG_CLUSTERPUT	2
69204076Spjd
70204076Spjdstruct	pagerops {
71210886Spjd	void		(*pgo_init)		/* Initialize pager. */
72210886Spjd			    __P((void));
73210886Spjd	vm_pager_t	(*pgo_alloc)		/* Allocate pager. */
74204076Spjd			    __P((caddr_t, vm_size_t, vm_prot_t, vm_offset_t));
75204076Spjd	void		(*pgo_dealloc)		/* Disassociate. */
76204076Spjd			    __P((vm_pager_t));
77204076Spjd	int		(*pgo_getpages)		/* Get (read) page. */
78204076Spjd			    __P((vm_pager_t, vm_page_t *, int, boolean_t));
79204076Spjd	int		(*pgo_putpages)		/* Put (write) page. */
80204076Spjd			    __P((vm_pager_t, vm_page_t *, int, boolean_t));
81204076Spjd	boolean_t  	(*pgo_haspage)		/* Does pager have page? */
82204076Spjd			    __P((vm_pager_t, vm_offset_t));
83204076Spjd	void		(*pgo_cluster)		/* Return range of cluster. */
84204076Spjd			    __P((vm_pager_t, vm_offset_t,
85204076Spjd				 vm_offset_t *, vm_offset_t *));
86204076Spjd};
87204076Spjd
88204076Spjd/*
89219818Spjd * get/put return values
90204076Spjd * OK	 operation was successful
91204076Spjd * BAD	 specified data was out of the accepted range
92204076Spjd * FAIL	 specified data was in range, but doesn't exist
93204076Spjd * PEND	 operations was initiated but not completed
94204076Spjd * ERROR error while accessing data that is in range and exists
95204076Spjd * AGAIN temporary resource shortage prevented operation from happening
96204076Spjd */
97204076Spjd#define	VM_PAGER_OK	0
98204076Spjd#define	VM_PAGER_BAD	1
99204076Spjd#define	VM_PAGER_FAIL	2
100204076Spjd#define	VM_PAGER_PEND	3
101204076Spjd#define	VM_PAGER_ERROR	4
102204076Spjd#define VM_PAGER_AGAIN	5
103204076Spjd
104204076Spjd#ifdef KERNEL
105204076Spjdextern struct pagerops *dfltpagerops;
106204076Spjd
107204076Spjdvm_pager_t	 vm_pager_allocate
108204076Spjd		    __P((int, caddr_t, vm_size_t, vm_prot_t, vm_offset_t));
109204076Spjdvm_page_t	 vm_pager_atop __P((vm_offset_t));
110204076Spjdvoid		 vm_pager_cluster
111204076Spjd		    __P((vm_pager_t, vm_offset_t,
112204076Spjd			 vm_offset_t *, vm_offset_t *));
113204076Spjdvoid		 vm_pager_clusternull
114204076Spjd		    __P((vm_pager_t, vm_offset_t,
115204076Spjd			 vm_offset_t *, vm_offset_t *));
116204076Spjdvoid		 vm_pager_deallocate __P((vm_pager_t));
117204076Spjdint		 vm_pager_get_pages
118204076Spjd		    __P((vm_pager_t, vm_page_t *, int, boolean_t));
119204076Spjdboolean_t	 vm_pager_has_page __P((vm_pager_t, vm_offset_t));
120204076Spjdvoid		 vm_pager_init __P((void));
121204076Spjdvm_pager_t	 vm_pager_lookup __P((struct pagerlst *, caddr_t));
122204076Spjdvm_offset_t	 vm_pager_map_pages __P((vm_page_t *, int, boolean_t));
123204076Spjdint		 vm_pager_put_pages
124204076Spjd		    __P((vm_pager_t, vm_page_t *, int, boolean_t));
125204076Spjdvoid		 vm_pager_sync __P((void));
126204076Spjdvoid		 vm_pager_unmap_pages __P((vm_offset_t, int));
127204076Spjd
128204076Spjd#define vm_pager_cancluster(p, b)	((p)->pg_flags & (b))
129204076Spjd
130204076Spjd/*
131204076Spjd * XXX compat with old interface
132204076Spjd */
133204076Spjd#define vm_pager_get(p, m, s) \
134204076Spjd({ \
135204076Spjd	vm_page_t ml[1]; \
136204076Spjd	ml[0] = (m); \
137204076Spjd	vm_pager_get_pages(p, ml, 1, s); \
138204076Spjd})
139204076Spjd#define vm_pager_put(p, m, s) \
140204076Spjd({ \
141204076Spjd	vm_page_t ml[1]; \
142204076Spjd	ml[0] = (m); \
143204076Spjd	vm_pager_put_pages(p, ml, 1, s); \
144204076Spjd})
145204076Spjd#endif
146204076Spjd
147204076Spjd#endif	/* _VM_PAGER_ */
148204076Spjd