default_pager.c revision 12820
19514Sdg/* 29514Sdg * Copyright (c) 1995, David Greenman 39514Sdg * All rights reserved. 49514Sdg * 59514Sdg * Redistribution and use in source and binary forms, with or without 69514Sdg * modification, are permitted provided that the following conditions 79514Sdg * are met: 89514Sdg * 1. Redistributions of source code must retain the above copyright 99514Sdg * notice, this list of conditions and the following disclaimer. 109514Sdg * 2. Redistributions in binary form must reproduce the above copyright 119514Sdg * notice, this list of conditions and the following disclaimer in the 129514Sdg * documentation and/or other materials provided with the distribution. 139514Sdg * 3. All advertising materials mentioning features or use of this software 149514Sdg * must display the following acknowledgement: 159514Sdg * This product includes software developed by David Greenman. 169514Sdg * 4. The name of the author may not be used to endorse or promote products 179514Sdg * derived from this software without specific prior written permission. 189514Sdg * 199514Sdg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 209514Sdg * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 219514Sdg * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 229514Sdg * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 239514Sdg * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 249514Sdg * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 259514Sdg * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 269514Sdg * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 279514Sdg * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 289514Sdg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 299514Sdg * SUCH DAMAGE. 309514Sdg * 3112820Sphk * $Id: default_pager.c,v 1.4 1995/12/11 04:57:56 dyson Exp $ 329514Sdg */ 339514Sdg 349513Sdg#include <sys/param.h> 359513Sdg#include <sys/systm.h> 369513Sdg#include <sys/kernel.h> 379513Sdg#include <sys/malloc.h> 3812662Sdg#include <sys/queue.h> 399513Sdg 409513Sdg#include <vm/vm.h> 4112662Sdg#include <vm/vm_param.h> 4212662Sdg#include <vm/vm_prot.h> 4312662Sdg#include <vm/vm_object.h> 4412662Sdg#include <vm/vm_page.h> 459513Sdg#include <vm/vm_pager.h> 469513Sdg#include <vm/default_pager.h> 479513Sdg#include <vm/swap_pager.h> 489513Sdg 4912820Sphkstatic vm_object_t default_pager_alloc __P((void *, vm_size_t, vm_prot_t, 5012820Sphk vm_ooffset_t)); 5112820Sphkstatic void default_pager_dealloc __P((vm_object_t)); 5212820Sphkstatic int default_pager_getpages __P((vm_object_t, vm_page_t *, int, int)); 5312820Sphkstatic int default_pager_putpages __P((vm_object_t, vm_page_t *, int, 5412820Sphk boolean_t, int *)); 5512820Sphkstatic boolean_t default_pager_haspage __P((vm_object_t, vm_pindex_t, int *, 5612820Sphk int *)); 579513Sdg/* 589513Sdg * pagerops for OBJT_DEFAULT - "default pager". 599513Sdg */ 609513Sdgstruct pagerops defaultpagerops = { 619513Sdg NULL, 629513Sdg default_pager_alloc, 639513Sdg default_pager_dealloc, 649513Sdg default_pager_getpages, 659513Sdg default_pager_putpages, 669513Sdg default_pager_haspage, 679513Sdg NULL 689513Sdg}; 699513Sdg 709513Sdg/* 719513Sdg * no_pager_alloc just returns an initialized object. 729513Sdg */ 7312820Sphkstatic vm_object_t 749513Sdgdefault_pager_alloc(handle, size, prot, offset) 759513Sdg void *handle; 769513Sdg register vm_size_t size; 779513Sdg vm_prot_t prot; 7812767Sdyson vm_ooffset_t offset; 799513Sdg{ 809513Sdg if (handle != NULL) 819513Sdg panic("default_pager_alloc: handle specified"); 829513Sdg 839513Sdg return vm_object_allocate(OBJT_DEFAULT, offset + size); 849513Sdg} 859513Sdg 8612820Sphkstatic void 879513Sdgdefault_pager_dealloc(object) 889513Sdg vm_object_t object; 899513Sdg{ 909513Sdg /* 919513Sdg * OBJT_DEFAULT objects have no special resources allocated to them. 929513Sdg */ 939513Sdg} 949513Sdg 959513Sdg/* 969513Sdg * The default pager has no backing store, so we always return 979513Sdg * failure. 989513Sdg */ 9912820Sphkstatic int 1009513Sdgdefault_pager_getpages(object, m, count, reqpage) 1019513Sdg vm_object_t object; 1029513Sdg vm_page_t *m; 1039513Sdg int count; 1049513Sdg int reqpage; 1059513Sdg{ 1069513Sdg return VM_PAGER_FAIL; 1079513Sdg} 1089513Sdg 10912820Sphkstatic int 1109513Sdgdefault_pager_putpages(object, m, c, sync, rtvals) 1119513Sdg vm_object_t object; 1129513Sdg vm_page_t *m; 1139513Sdg int c; 1149513Sdg boolean_t sync; 1159513Sdg int *rtvals; 1169513Sdg{ 1179513Sdg int i; 1189513Sdg 1199513Sdg /* 1209513Sdg * Try to convert the object type into a OBJT_SWAP. 1219513Sdg * If the swp structure allocation fails, convert it 1229513Sdg * back to OBJT_DEFAULT and return failure. Otherwise 1239513Sdg * pass this putpages to the swap pager. 1249513Sdg */ 1259513Sdg object->type = OBJT_SWAP; 1269513Sdg 1279513Sdg if (swap_pager_swp_alloc(object, M_KERNEL) != 0) { 1289513Sdg object->type = OBJT_DEFAULT; 1299513Sdg for (i = 0; i < c; i++) 1309513Sdg rtvals[i] = VM_PAGER_FAIL; 1319513Sdg return VM_PAGER_FAIL; 1329513Sdg } 1339513Sdg 1349513Sdg return swap_pager_putpages(object, m, c, sync, rtvals); 1359513Sdg} 1369513Sdg 13712820Sphkstatic boolean_t 13812767Sdysondefault_pager_haspage(object, pindex, before, after) 1399513Sdg vm_object_t object; 14012767Sdyson vm_pindex_t pindex; 1419513Sdg int *before; 1429513Sdg int *after; 1439513Sdg{ 1449513Sdg return FALSE; 1459513Sdg} 146