default_pager.c revision 9514
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 * 319514Sdg * $Id$ 329514Sdg */ 339514Sdg 349513Sdg#include <sys/param.h> 359513Sdg#include <sys/systm.h> 369513Sdg#include <sys/kernel.h> 379513Sdg#include <sys/malloc.h> 389513Sdg 399513Sdg#include <vm/vm.h> 409513Sdg#include <vm/vm_pager.h> 419513Sdg#include <vm/vm_page.h> 429513Sdg#include <vm/default_pager.h> 439513Sdg#include <vm/swap_pager.h> 449513Sdg 459513Sdg/* 469513Sdg * pagerops for OBJT_DEFAULT - "default pager". 479513Sdg */ 489513Sdgstruct pagerops defaultpagerops = { 499513Sdg NULL, 509513Sdg default_pager_alloc, 519513Sdg default_pager_dealloc, 529513Sdg default_pager_getpages, 539513Sdg default_pager_putpages, 549513Sdg default_pager_haspage, 559513Sdg NULL 569513Sdg}; 579513Sdg 589513Sdg/* 599513Sdg * no_pager_alloc just returns an initialized object. 609513Sdg */ 619513Sdgvm_object_t 629513Sdgdefault_pager_alloc(handle, size, prot, offset) 639513Sdg void *handle; 649513Sdg register vm_size_t size; 659513Sdg vm_prot_t prot; 669513Sdg vm_offset_t offset; 679513Sdg{ 689513Sdg if (handle != NULL) 699513Sdg panic("default_pager_alloc: handle specified"); 709513Sdg 719513Sdg return vm_object_allocate(OBJT_DEFAULT, offset + size); 729513Sdg} 739513Sdg 749513Sdgvoid 759513Sdgdefault_pager_dealloc(object) 769513Sdg vm_object_t object; 779513Sdg{ 789513Sdg /* 799513Sdg * OBJT_DEFAULT objects have no special resources allocated to them. 809513Sdg */ 819513Sdg} 829513Sdg 839513Sdg/* 849513Sdg * The default pager has no backing store, so we always return 859513Sdg * failure. 869513Sdg */ 879513Sdgint 889513Sdgdefault_pager_getpages(object, m, count, reqpage) 899513Sdg vm_object_t object; 909513Sdg vm_page_t *m; 919513Sdg int count; 929513Sdg int reqpage; 939513Sdg{ 949513Sdg return VM_PAGER_FAIL; 959513Sdg} 969513Sdg 979513Sdgint 989513Sdgdefault_pager_putpages(object, m, c, sync, rtvals) 999513Sdg vm_object_t object; 1009513Sdg vm_page_t *m; 1019513Sdg int c; 1029513Sdg boolean_t sync; 1039513Sdg int *rtvals; 1049513Sdg{ 1059513Sdg int i; 1069513Sdg 1079513Sdg /* 1089513Sdg * Try to convert the object type into a OBJT_SWAP. 1099513Sdg * If the swp structure allocation fails, convert it 1109513Sdg * back to OBJT_DEFAULT and return failure. Otherwise 1119513Sdg * pass this putpages to the swap pager. 1129513Sdg */ 1139513Sdg object->type = OBJT_SWAP; 1149513Sdg 1159513Sdg if (swap_pager_swp_alloc(object, M_KERNEL) != 0) { 1169513Sdg object->type = OBJT_DEFAULT; 1179513Sdg for (i = 0; i < c; i++) 1189513Sdg rtvals[i] = VM_PAGER_FAIL; 1199513Sdg return VM_PAGER_FAIL; 1209513Sdg } 1219513Sdg 1229513Sdg return swap_pager_putpages(object, m, c, sync, rtvals); 1239513Sdg} 1249513Sdg 1259513Sdgboolean_t 1269513Sdgdefault_pager_haspage(object, offset, before, after) 1279513Sdg vm_object_t object; 1289513Sdg vm_offset_t offset; 1299513Sdg int *before; 1309513Sdg int *after; 1319513Sdg{ 1329513Sdg return FALSE; 1339513Sdg} 134