default_pager.c revision 40286
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 * 3140286Sdg * $Id: default_pager.c,v 1.15 1998/02/06 12:14:20 eivind Exp $ 329514Sdg */ 339514Sdg 349513Sdg#include <sys/param.h> 359513Sdg#include <sys/systm.h> 369513Sdg#include <sys/malloc.h> 3716409Sdyson#include <sys/vmmeter.h> 389513Sdg 399513Sdg#include <vm/vm.h> 4012662Sdg#include <vm/vm_prot.h> 4112662Sdg#include <vm/vm_object.h> 4212662Sdg#include <vm/vm_page.h> 439513Sdg#include <vm/vm_pager.h> 449513Sdg#include <vm/default_pager.h> 459513Sdg#include <vm/swap_pager.h> 469513Sdg 4740286Sdgstatic vm_object_t default_pager_alloc __P((void *, vm_ooffset_t, vm_prot_t, 4812820Sphk vm_ooffset_t)); 4912820Sphkstatic void default_pager_dealloc __P((vm_object_t)); 5012820Sphkstatic int default_pager_getpages __P((vm_object_t, vm_page_t *, int, int)); 5112820Sphkstatic int default_pager_putpages __P((vm_object_t, vm_page_t *, int, 5212820Sphk boolean_t, int *)); 5312820Sphkstatic boolean_t default_pager_haspage __P((vm_object_t, vm_pindex_t, int *, 5412820Sphk int *)); 559513Sdg/* 569513Sdg * pagerops for OBJT_DEFAULT - "default pager". 579513Sdg */ 589513Sdgstruct pagerops defaultpagerops = { 599513Sdg NULL, 609513Sdg default_pager_alloc, 619513Sdg default_pager_dealloc, 629513Sdg default_pager_getpages, 639513Sdg default_pager_putpages, 649513Sdg default_pager_haspage, 659513Sdg NULL 669513Sdg}; 679513Sdg 689513Sdg/* 699513Sdg * no_pager_alloc just returns an initialized object. 709513Sdg */ 7112820Sphkstatic vm_object_t 7240286Sdgdefault_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, 7328751Sbde vm_ooffset_t offset) 749513Sdg{ 759513Sdg if (handle != NULL) 769513Sdg panic("default_pager_alloc: handle specified"); 779513Sdg 7840286Sdg return vm_object_allocate(OBJT_DEFAULT, OFF_TO_IDX(round_page(offset + size))); 799513Sdg} 809513Sdg 8112820Sphkstatic void 829513Sdgdefault_pager_dealloc(object) 839513Sdg vm_object_t object; 849513Sdg{ 859513Sdg /* 869513Sdg * OBJT_DEFAULT objects have no special resources allocated to them. 879513Sdg */ 889513Sdg} 899513Sdg 909513Sdg/* 919513Sdg * The default pager has no backing store, so we always return 929513Sdg * failure. 939513Sdg */ 9412820Sphkstatic int 959513Sdgdefault_pager_getpages(object, m, count, reqpage) 969513Sdg vm_object_t object; 979513Sdg vm_page_t *m; 989513Sdg int count; 999513Sdg int reqpage; 1009513Sdg{ 1019513Sdg return VM_PAGER_FAIL; 1029513Sdg} 1039513Sdg 10412820Sphkstatic int 1059513Sdgdefault_pager_putpages(object, m, c, sync, rtvals) 1069513Sdg vm_object_t object; 1079513Sdg vm_page_t *m; 1089513Sdg int c; 1099513Sdg boolean_t sync; 1109513Sdg int *rtvals; 1119513Sdg{ 1129513Sdg int i; 1139513Sdg 1149513Sdg /* 1159513Sdg * Try to convert the object type into a OBJT_SWAP. 1169513Sdg * If the swp structure allocation fails, convert it 1179513Sdg * back to OBJT_DEFAULT and return failure. Otherwise 1189513Sdg * pass this putpages to the swap pager. 1199513Sdg */ 1209513Sdg object->type = OBJT_SWAP; 1219513Sdg 1229513Sdg if (swap_pager_swp_alloc(object, M_KERNEL) != 0) { 12315978Sdyson object->type = OBJT_DEFAULT; 12415978Sdyson for (i = 0; i < c; i++) 12515978Sdyson rtvals[i] = VM_PAGER_FAIL; 12615978Sdyson return VM_PAGER_FAIL; 1279513Sdg } 1289513Sdg 1299513Sdg return swap_pager_putpages(object, m, c, sync, rtvals); 1309513Sdg} 1319513Sdg 13212820Sphkstatic boolean_t 13312767Sdysondefault_pager_haspage(object, pindex, before, after) 1349513Sdg vm_object_t object; 13512767Sdyson vm_pindex_t pindex; 1369513Sdg int *before; 1379513Sdg int *after; 1389513Sdg{ 1399513Sdg return FALSE; 1409513Sdg} 14115978Sdyson 14215978Sdysonvoid 14315978Sdysondefault_pager_convert_to_swap(object) 14415978Sdyson vm_object_t object; 14515978Sdyson{ 14615978Sdyson object->type = OBJT_SWAP; 14715978Sdyson if (swap_pager_swp_alloc(object, M_KERNEL) != 0) { 14815978Sdyson object->type = OBJT_DEFAULT; 14915978Sdyson } 15015978Sdyson} 15116409Sdyson 15216409Sdysonvoid 15316409Sdysondefault_pager_convert_to_swapq(object) 15416409Sdyson vm_object_t object; 15516409Sdyson{ 15616409Sdyson if (object && 15716409Sdyson (object->type == OBJT_DEFAULT) && 15816409Sdyson (object != kernel_object && object != kmem_object) && 15916409Sdyson (object->size > ((cnt.v_page_count - cnt.v_wire_count) / 4))) 16016409Sdyson default_pager_convert_to_swap(object); 16116409Sdyson} 16216409Sdyson 163