default_pager.c revision 9513
1#include <sys/param.h>
2#include <sys/systm.h>
3#include <sys/kernel.h>
4#include <sys/malloc.h>
5
6#include <vm/vm.h>
7#include <vm/vm_pager.h>
8#include <vm/vm_page.h>
9#include <vm/default_pager.h>
10#include <vm/swap_pager.h>
11
12/*
13 * pagerops for OBJT_DEFAULT - "default pager".
14 */
15struct pagerops defaultpagerops = {
16	NULL,
17	default_pager_alloc,
18	default_pager_dealloc,
19	default_pager_getpages,
20	default_pager_putpages,
21	default_pager_haspage,
22	NULL
23};
24
25/*
26 * no_pager_alloc just returns an initialized object.
27 */
28vm_object_t
29default_pager_alloc(handle, size, prot, offset)
30	void *handle;
31	register vm_size_t size;
32	vm_prot_t prot;
33	vm_offset_t offset;
34{
35	if (handle != NULL)
36		panic("default_pager_alloc: handle specified");
37
38	return vm_object_allocate(OBJT_DEFAULT, offset + size);
39}
40
41void
42default_pager_dealloc(object)
43	vm_object_t object;
44{
45	/*
46	 * OBJT_DEFAULT objects have no special resources allocated to them.
47	 */
48}
49
50/*
51 * The default pager has no backing store, so we always return
52 * failure.
53 */
54int
55default_pager_getpages(object, m, count, reqpage)
56	vm_object_t object;
57	vm_page_t *m;
58	int count;
59	int reqpage;
60{
61	return VM_PAGER_FAIL;
62}
63
64int
65default_pager_putpages(object, m, c, sync, rtvals)
66	vm_object_t object;
67	vm_page_t *m;
68	int c;
69	boolean_t sync;
70	int *rtvals;
71{
72	int i;
73
74	/*
75	 * Try to convert the object type into a OBJT_SWAP.
76	 * If the swp structure allocation fails, convert it
77	 * back to OBJT_DEFAULT and return failure. Otherwise
78	 * pass this putpages to the swap pager.
79	 */
80	object->type = OBJT_SWAP;
81
82	if (swap_pager_swp_alloc(object, M_KERNEL) != 0) {
83		object->type = OBJT_DEFAULT;
84		for (i = 0; i < c; i++)
85			rtvals[i] = VM_PAGER_FAIL;
86		return VM_PAGER_FAIL;
87	}
88
89	return swap_pager_putpages(object, m, c, sync, rtvals);
90}
91
92boolean_t
93default_pager_haspage(object, offset, before, after)
94	vm_object_t object;
95	vm_offset_t offset;
96	int *before;
97	int *after;
98{
99	return FALSE;
100}
101