default_pager.c revision 42957
1/*
2 * Copyright (c) 1995, David Greenman
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 *    must display the following acknowledgement:
15 *	This product includes software developed by David Greenman.
16 * 4. The name of the author may not be used to endorse or promote products
17 *    derived from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
31 * The default pager is responsible for supplying backing store to unbacked
32 * storage.  The backing store is usually swap so we just fall through to
33 * the swap routines.  However, since swap metadata has not been assigned,
34 * the swap routines assign and manage the swap backing store through the
35 * vm_page->swapblk field.  The object is only converted when the page is
36 * physically freed after having been cleaned and even then vm_page->swapblk
37 * is maintained whenever a resident page also has swap backing store.
38 *
39 *	$Id: default_pager.c,v 1.16 1998/10/13 08:24:42 dg Exp $
40 */
41
42#include <sys/param.h>
43#include <sys/systm.h>
44#include <sys/malloc.h>
45#include <sys/vmmeter.h>
46
47#include <vm/vm.h>
48#include <vm/vm_prot.h>
49#include <vm/vm_object.h>
50#include <vm/vm_page.h>
51#include <vm/vm_pager.h>
52#include <vm/default_pager.h>
53#include <vm/swap_pager.h>
54
55static vm_object_t default_pager_alloc __P((void *, vm_ooffset_t, vm_prot_t,
56		vm_ooffset_t));
57static void default_pager_dealloc __P((vm_object_t));
58static int default_pager_getpages __P((vm_object_t, vm_page_t *, int, int));
59static int default_pager_putpages __P((vm_object_t, vm_page_t *, int,
60		boolean_t, int *));
61static boolean_t default_pager_haspage __P((vm_object_t, vm_pindex_t, int *,
62		int *));
63/*
64 * pagerops for OBJT_DEFAULT - "default pager".
65 */
66struct pagerops defaultpagerops = {
67	NULL,
68	default_pager_alloc,
69	default_pager_dealloc,
70	default_pager_getpages,
71	default_pager_putpages,
72	default_pager_haspage,
73	NULL
74};
75
76/*
77 * no_pager_alloc just returns an initialized object.
78 */
79static vm_object_t
80default_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot,
81		    vm_ooffset_t offset)
82{
83	if (handle != NULL)
84		panic("default_pager_alloc: handle specified");
85
86	return vm_object_allocate(OBJT_DEFAULT, OFF_TO_IDX(round_page(offset + size)));
87}
88
89/*
90 * deallocate resources associated with default objects.   The default objects
91 * have no special resources allocated to them, but the vm_page's being used
92 * in this object might.  Still, we do not have to do anything - we will free
93 * the swapblk in the underlying vm_page's when we free the vm_page or
94 * garbage collect the vm_page cache list.
95 */
96
97static void
98default_pager_dealloc(object)
99	vm_object_t object;
100{
101	/*
102	 * OBJT_DEFAULT objects have no special resources allocated to them.
103	 */
104}
105
106/*
107 * Load pages from backing store.  Since OBJT_DEFAULT is converted to
108 * OBJT_SWAP at the time a swap-backed vm_page_t is freed, we will never
109 * see a vm_page with assigned swap here.
110 */
111
112static int
113default_pager_getpages(object, m, count, reqpage)
114	vm_object_t object;
115	vm_page_t *m;
116	int count;
117	int reqpage;
118{
119	return VM_PAGER_FAIL;
120}
121
122/*
123 * Store pages to backing store.  We should assign swap and initiate
124 * I/O.  We do not actually convert the object to OBJT_SWAP here.  The
125 * object will be converted when the written-out vm_page_t is moved from the
126 * cache to the free list.
127 */
128
129static int
130default_pager_putpages(object, m, c, sync, rtvals)
131	vm_object_t object;
132	vm_page_t *m;
133	int c;
134	boolean_t sync;
135	int *rtvals;
136{
137	return swap_pager_putpages(object, m, c, sync, rtvals);
138}
139
140/*
141 * Tell us whether the backing store for the requested (object,index) is
142 * synchronized.  i.e. tell us whether we can throw the page away and
143 * reload it later.  So, for example, if we are in the process of writing
144 * the page to its backing store, or if no backing store has been assigned,
145 * it is not yet synchronized.
146 *
147 * It is possible to have fully-synchronized swap assigned without the
148 * object having been converted.  We just call swap_pager_haspage() to
149 * deal with it since it must already deal with it plus deal with swap
150 * meta-data structures.
151 */
152
153static boolean_t
154default_pager_haspage(object, pindex, before, after)
155	vm_object_t object;
156	vm_pindex_t pindex;
157	int *before;
158	int *after;
159{
160	return FALSE;
161}
162
163