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