vm_pager.h revision 1542
1204076Spjd/* 2204076Spjd * Copyright (c) 1990 University of Utah. 3219351Spjd * Copyright (c) 1991, 1993 4204076Spjd * The Regents of the University of California. All rights reserved. 5204076Spjd * 6204076Spjd * This code is derived from software contributed to Berkeley by 7204076Spjd * the Systems Programming Group of the University of Utah Computer 8204076Spjd * Science Department. 9204076Spjd * 10204076Spjd * Redistribution and use in source and binary forms, with or without 11204076Spjd * modification, are permitted provided that the following conditions 12204076Spjd * are met: 13204076Spjd * 1. Redistributions of source code must retain the above copyright 14204076Spjd * notice, this list of conditions and the following disclaimer. 15204076Spjd * 2. Redistributions in binary form must reproduce the above copyright 16204076Spjd * notice, this list of conditions and the following disclaimer in the 17204076Spjd * documentation and/or other materials provided with the distribution. 18204076Spjd * 3. All advertising materials mentioning features or use of this software 19204076Spjd * must display the following acknowledgement: 20204076Spjd * This product includes software developed by the University of 21204076Spjd * California, Berkeley and its contributors. 22204076Spjd * 4. Neither the name of the University nor the names of its contributors 23204076Spjd * may be used to endorse or promote products derived from this software 24204076Spjd * without specific prior written permission. 25204076Spjd * 26204076Spjd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 27204076Spjd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 28204076Spjd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 29204076Spjd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 30204076Spjd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 31204076Spjd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 32204076Spjd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33204076Spjd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34204076Spjd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35204076Spjd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36204076Spjd * SUCH DAMAGE. 37204076Spjd * 38204076Spjd * @(#)vm_pager.h 8.4 (Berkeley) 1/12/94 39204076Spjd */ 40204076Spjd 41204076Spjd/* 42204076Spjd * Pager routine interface definition. 43204076Spjd * For BSD we use a cleaner version of the internal pager interface. 44204076Spjd */ 45204076Spjd 46204076Spjd#ifndef _VM_PAGER_ 47204076Spjd#define _VM_PAGER_ 48211982Spjd 49204076SpjdTAILQ_HEAD(pagerlst, pager_struct); 50204076Spjd 51204076Spjdstruct pager_struct { 52204076Spjd TAILQ_ENTRY(pager_struct) pg_list; /* links for list management */ 53204076Spjd caddr_t pg_handle; /* ext. handle (vp, dev, fp) */ 54204076Spjd int pg_type; /* type of pager */ 55204076Spjd int pg_flags; /* flags */ 56204076Spjd struct pagerops *pg_ops; /* pager operations */ 57204076Spjd void *pg_data; /* private pager data */ 58204076Spjd}; 59204076Spjd 60212038Spjd/* pager types */ 61204076Spjd#define PG_DFLT -1 62204076Spjd#define PG_SWAP 0 63204076Spjd#define PG_VNODE 1 64211886Spjd#define PG_DEVICE 2 65204076Spjd 66204076Spjd/* flags */ 67204076Spjd#define PG_CLUSTERGET 1 68204076Spjd#define PG_CLUSTERPUT 2 69204076Spjd 70204076Spjdstruct pagerops { 71210886Spjd void (*pgo_init) /* Initialize pager. */ 72210886Spjd __P((void)); 73210886Spjd vm_pager_t (*pgo_alloc) /* Allocate pager. */ 74204076Spjd __P((caddr_t, vm_size_t, vm_prot_t, vm_offset_t)); 75204076Spjd void (*pgo_dealloc) /* Disassociate. */ 76204076Spjd __P((vm_pager_t)); 77204076Spjd int (*pgo_getpages) /* Get (read) page. */ 78204076Spjd __P((vm_pager_t, vm_page_t *, int, boolean_t)); 79204076Spjd int (*pgo_putpages) /* Put (write) page. */ 80204076Spjd __P((vm_pager_t, vm_page_t *, int, boolean_t)); 81204076Spjd boolean_t (*pgo_haspage) /* Does pager have page? */ 82204076Spjd __P((vm_pager_t, vm_offset_t)); 83204076Spjd void (*pgo_cluster) /* Return range of cluster. */ 84204076Spjd __P((vm_pager_t, vm_offset_t, 85204076Spjd vm_offset_t *, vm_offset_t *)); 86204076Spjd}; 87204076Spjd 88204076Spjd/* 89219818Spjd * get/put return values 90204076Spjd * OK operation was successful 91204076Spjd * BAD specified data was out of the accepted range 92204076Spjd * FAIL specified data was in range, but doesn't exist 93204076Spjd * PEND operations was initiated but not completed 94204076Spjd * ERROR error while accessing data that is in range and exists 95204076Spjd * AGAIN temporary resource shortage prevented operation from happening 96204076Spjd */ 97204076Spjd#define VM_PAGER_OK 0 98204076Spjd#define VM_PAGER_BAD 1 99204076Spjd#define VM_PAGER_FAIL 2 100204076Spjd#define VM_PAGER_PEND 3 101204076Spjd#define VM_PAGER_ERROR 4 102204076Spjd#define VM_PAGER_AGAIN 5 103204076Spjd 104204076Spjd#ifdef KERNEL 105204076Spjdextern struct pagerops *dfltpagerops; 106204076Spjd 107204076Spjdvm_pager_t vm_pager_allocate 108204076Spjd __P((int, caddr_t, vm_size_t, vm_prot_t, vm_offset_t)); 109204076Spjdvm_page_t vm_pager_atop __P((vm_offset_t)); 110204076Spjdvoid vm_pager_cluster 111204076Spjd __P((vm_pager_t, vm_offset_t, 112204076Spjd vm_offset_t *, vm_offset_t *)); 113204076Spjdvoid vm_pager_clusternull 114204076Spjd __P((vm_pager_t, vm_offset_t, 115204076Spjd vm_offset_t *, vm_offset_t *)); 116204076Spjdvoid vm_pager_deallocate __P((vm_pager_t)); 117204076Spjdint vm_pager_get_pages 118204076Spjd __P((vm_pager_t, vm_page_t *, int, boolean_t)); 119204076Spjdboolean_t vm_pager_has_page __P((vm_pager_t, vm_offset_t)); 120204076Spjdvoid vm_pager_init __P((void)); 121204076Spjdvm_pager_t vm_pager_lookup __P((struct pagerlst *, caddr_t)); 122204076Spjdvm_offset_t vm_pager_map_pages __P((vm_page_t *, int, boolean_t)); 123204076Spjdint vm_pager_put_pages 124204076Spjd __P((vm_pager_t, vm_page_t *, int, boolean_t)); 125204076Spjdvoid vm_pager_sync __P((void)); 126204076Spjdvoid vm_pager_unmap_pages __P((vm_offset_t, int)); 127204076Spjd 128204076Spjd#define vm_pager_cancluster(p, b) ((p)->pg_flags & (b)) 129204076Spjd 130204076Spjd/* 131204076Spjd * XXX compat with old interface 132204076Spjd */ 133204076Spjd#define vm_pager_get(p, m, s) \ 134204076Spjd({ \ 135204076Spjd vm_page_t ml[1]; \ 136204076Spjd ml[0] = (m); \ 137204076Spjd vm_pager_get_pages(p, ml, 1, s); \ 138204076Spjd}) 139204076Spjd#define vm_pager_put(p, m, s) \ 140204076Spjd({ \ 141204076Spjd vm_page_t ml[1]; \ 142204076Spjd ml[0] = (m); \ 143204076Spjd vm_pager_put_pages(p, ml, 1, s); \ 144204076Spjd}) 145204076Spjd#endif 146204076Spjd 147204076Spjd#endif /* _VM_PAGER_ */ 148204076Spjd