1df8bae1dSRodney W. Grimes /* 2df8bae1dSRodney W. Grimes * Copyright (c) 1990 University of Utah. 3df8bae1dSRodney W. Grimes * Copyright (c) 1991, 1993 4df8bae1dSRodney W. Grimes * The Regents of the University of California. All rights reserved. 5df8bae1dSRodney W. Grimes * 6df8bae1dSRodney W. Grimes * This code is derived from software contributed to Berkeley by 7df8bae1dSRodney W. Grimes * the Systems Programming Group of the University of Utah Computer 8df8bae1dSRodney W. Grimes * Science Department. 9df8bae1dSRodney W. Grimes * 10df8bae1dSRodney W. Grimes * Redistribution and use in source and binary forms, with or without 11df8bae1dSRodney W. Grimes * modification, are permitted provided that the following conditions 12df8bae1dSRodney W. Grimes * are met: 13df8bae1dSRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 14df8bae1dSRodney W. Grimes * notice, this list of conditions and the following disclaimer. 15df8bae1dSRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 16df8bae1dSRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 17df8bae1dSRodney W. Grimes * documentation and/or other materials provided with the distribution. 18df8bae1dSRodney W. Grimes * 3. All advertising materials mentioning features or use of this software 19df8bae1dSRodney W. Grimes * must display the following acknowledgement: 20df8bae1dSRodney W. Grimes * This product includes software developed by the University of 21df8bae1dSRodney W. Grimes * California, Berkeley and its contributors. 22df8bae1dSRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 23df8bae1dSRodney W. Grimes * may be used to endorse or promote products derived from this software 24df8bae1dSRodney W. Grimes * without specific prior written permission. 25df8bae1dSRodney W. Grimes * 26df8bae1dSRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 27df8bae1dSRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 28df8bae1dSRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 29df8bae1dSRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 30df8bae1dSRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 31df8bae1dSRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 32df8bae1dSRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33df8bae1dSRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34df8bae1dSRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35df8bae1dSRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36df8bae1dSRodney W. Grimes * SUCH DAMAGE. 37df8bae1dSRodney W. Grimes * 38df8bae1dSRodney W. Grimes * @(#)vm_pager.h 8.4 (Berkeley) 1/12/94 39c3aac50fSPeter Wemm * $FreeBSD$ 40df8bae1dSRodney W. Grimes */ 41df8bae1dSRodney W. Grimes 42df8bae1dSRodney W. Grimes /* 43df8bae1dSRodney W. Grimes * Pager routine interface definition. 44df8bae1dSRodney W. Grimes */ 45df8bae1dSRodney W. Grimes 46df8bae1dSRodney W. Grimes #ifndef _VM_PAGER_ 47df8bae1dSRodney W. Grimes #define _VM_PAGER_ 48df8bae1dSRodney W. Grimes 49e7a58978SBruce Evans #include <sys/queue.h> 50e7a58978SBruce Evans 51e3975643SJake Burkholder TAILQ_HEAD(pagerlst, vm_object); 52df8bae1dSRodney W. Grimes 530b441832SPoul-Henning Kamp struct bio; 54a5296b05SJulian Elischer 55df8bae1dSRodney W. Grimes struct pagerops { 5611caded3SAlfred Perlstein void (*pgo_init)(void); /* Initialize pager. */ 5711caded3SAlfred Perlstein vm_object_t (*pgo_alloc)(void *, vm_ooffset_t, vm_prot_t, vm_ooffset_t); /* Allocate pager. */ 5811caded3SAlfred Perlstein void (*pgo_dealloc)(vm_object_t); /* Disassociate. */ 5911caded3SAlfred Perlstein int (*pgo_getpages)(vm_object_t, vm_page_t *, int, int); /* Get (read) page. */ 6011caded3SAlfred Perlstein void (*pgo_putpages)(vm_object_t, vm_page_t *, int, int, int *); /* Put (write) page. */ 6111caded3SAlfred Perlstein boolean_t (*pgo_haspage)(vm_object_t, vm_pindex_t, int *, int *); /* Does pager have page? */ 6211caded3SAlfred Perlstein void (*pgo_pageunswapped)(vm_page_t); 6311caded3SAlfred Perlstein void (*pgo_strategy)(vm_object_t, struct bio *); 64df8bae1dSRodney W. Grimes }; 65df8bae1dSRodney W. Grimes 66df8bae1dSRodney W. Grimes /* 67df8bae1dSRodney W. Grimes * get/put return values 68df8bae1dSRodney W. Grimes * OK operation was successful 69df8bae1dSRodney W. Grimes * BAD specified data was out of the accepted range 70df8bae1dSRodney W. Grimes * FAIL specified data was in range, but doesn't exist 71df8bae1dSRodney W. Grimes * PEND operations was initiated but not completed 72df8bae1dSRodney W. Grimes * ERROR error while accessing data that is in range and exists 73df8bae1dSRodney W. Grimes * AGAIN temporary resource shortage prevented operation from happening 74df8bae1dSRodney W. Grimes */ 75df8bae1dSRodney W. Grimes #define VM_PAGER_OK 0 76df8bae1dSRodney W. Grimes #define VM_PAGER_BAD 1 77df8bae1dSRodney W. Grimes #define VM_PAGER_FAIL 2 78df8bae1dSRodney W. Grimes #define VM_PAGER_PEND 3 79df8bae1dSRodney W. Grimes #define VM_PAGER_ERROR 4 80df8bae1dSRodney W. Grimes #define VM_PAGER_AGAIN 5 81df8bae1dSRodney W. Grimes 828f9110f6SJohn Dyson #define VM_PAGER_PUT_SYNC 0x1 838f9110f6SJohn Dyson #define VM_PAGER_PUT_INVAL 0x2 848f9110f6SJohn Dyson 85c4473420SPeter Wemm #ifdef _KERNEL 86a1c995b6SPoul-Henning Kamp #ifdef MALLOC_DECLARE 87a1c995b6SPoul-Henning Kamp MALLOC_DECLARE(M_VMPGDATA); 88a1c995b6SPoul-Henning Kamp #endif 89a1c995b6SPoul-Henning Kamp 9028f8db14SBruce Evans extern vm_map_t pager_map; 9128f8db14SBruce Evans extern int pager_map_size; 921c7c3c6aSMatthew Dillon extern struct pagerops *pagertab[]; 932a758ebeSAlfred Perlstein extern struct mtx pbuf_mtx; 9428f8db14SBruce Evans 9511caded3SAlfred Perlstein vm_object_t vm_pager_allocate(objtype_t, void *, vm_ooffset_t, vm_prot_t, vm_ooffset_t); 9611caded3SAlfred Perlstein void vm_pager_bufferinit(void); 9711caded3SAlfred Perlstein void vm_pager_deallocate(vm_object_t); 9811caded3SAlfred Perlstein static __inline int vm_pager_get_pages(vm_object_t, vm_page_t *, int, int); 9911caded3SAlfred Perlstein static __inline boolean_t vm_pager_has_page(vm_object_t, vm_pindex_t, int *, int *); 10011caded3SAlfred Perlstein void vm_pager_init(void); 10111caded3SAlfred Perlstein vm_object_t vm_pager_object_lookup(struct pagerlst *, void *); 10211caded3SAlfred Perlstein vm_offset_t vm_pager_map_pages(vm_page_t *, int, boolean_t); 10311caded3SAlfred Perlstein vm_offset_t vm_pager_map_page(vm_page_t); 10411caded3SAlfred Perlstein void vm_pager_sync(void); 10511caded3SAlfred Perlstein void vm_pager_unmap_pages(vm_offset_t, int); 10611caded3SAlfred Perlstein void vm_pager_unmap_page(vm_offset_t); 10711caded3SAlfred Perlstein void vm_pager_strategy(vm_object_t object, struct bio *bp); 1081c7c3c6aSMatthew Dillon 1094221e284SAlan Cox /* 1104221e284SAlan Cox * vm_page_get_pages: 1114221e284SAlan Cox * 1124221e284SAlan Cox * Retrieve pages from the VM system in order to map them into an object 1134221e284SAlan Cox * ( or into VM space somewhere ). If the pagein was successful, we 1144221e284SAlan Cox * must fully validate it. 1154221e284SAlan Cox */ 1161c7c3c6aSMatthew Dillon static __inline int 1171c7c3c6aSMatthew Dillon vm_pager_get_pages( 1181c7c3c6aSMatthew Dillon vm_object_t object, 1191c7c3c6aSMatthew Dillon vm_page_t *m, 1201c7c3c6aSMatthew Dillon int count, 1211c7c3c6aSMatthew Dillon int reqpage 1221c7c3c6aSMatthew Dillon ) { 1234221e284SAlan Cox int r; 1244221e284SAlan Cox 1250cddd8f0SMatthew Dillon GIANT_REQUIRED; 1260cddd8f0SMatthew Dillon 1274221e284SAlan Cox r = (*pagertab[object->type]->pgo_getpages)(object, m, count, reqpage); 1284221e284SAlan Cox if (r == VM_PAGER_OK && m[reqpage]->valid != VM_PAGE_BITS_ALL) { 1294221e284SAlan Cox vm_page_zero_invalid(m[reqpage], TRUE); 1304221e284SAlan Cox } 1314221e284SAlan Cox return (r); 1321c7c3c6aSMatthew Dillon } 1331c7c3c6aSMatthew Dillon 134e4542174SMatthew Dillon static __inline void 1351c7c3c6aSMatthew Dillon vm_pager_put_pages( 1361c7c3c6aSMatthew Dillon vm_object_t object, 1371c7c3c6aSMatthew Dillon vm_page_t *m, 1381c7c3c6aSMatthew Dillon int count, 1391c7c3c6aSMatthew Dillon int flags, 1401c7c3c6aSMatthew Dillon int *rtvals 1411c7c3c6aSMatthew Dillon ) { 1420cddd8f0SMatthew Dillon GIANT_REQUIRED; 143e4542174SMatthew Dillon (*pagertab[object->type]->pgo_putpages) 144e4542174SMatthew Dillon (object, m, count, flags, rtvals); 1451c7c3c6aSMatthew Dillon } 1461c7c3c6aSMatthew Dillon 14725db2c54SMatthew Dillon /* 14825db2c54SMatthew Dillon * vm_pager_haspage 14925db2c54SMatthew Dillon * 15025db2c54SMatthew Dillon * Check to see if an object's pager has the requested page. The 15125db2c54SMatthew Dillon * object's pager will also set before and after to give the caller 15225db2c54SMatthew Dillon * some idea of the number of pages before and after the requested 15325db2c54SMatthew Dillon * page can be I/O'd efficiently. 15425db2c54SMatthew Dillon * 15525db2c54SMatthew Dillon * This routine does not have to be called at any particular spl. 15625db2c54SMatthew Dillon */ 1571c7c3c6aSMatthew Dillon static __inline boolean_t 1581c7c3c6aSMatthew Dillon vm_pager_has_page( 1591c7c3c6aSMatthew Dillon vm_object_t object, 1601c7c3c6aSMatthew Dillon vm_pindex_t offset, 1611c7c3c6aSMatthew Dillon int *before, 1621c7c3c6aSMatthew Dillon int *after 1631c7c3c6aSMatthew Dillon ) { 16423955314SAlfred Perlstein boolean_t ret; 16523955314SAlfred Perlstein 1660cddd8f0SMatthew Dillon GIANT_REQUIRED; 16723955314SAlfred Perlstein ret = (*pagertab[object->type]->pgo_haspage) 16823955314SAlfred Perlstein (object, offset, before, after); 16923955314SAlfred Perlstein return (ret); 1701c7c3c6aSMatthew Dillon } 1711c7c3c6aSMatthew Dillon 1721c7c3c6aSMatthew Dillon /* 1731c7c3c6aSMatthew Dillon * vm_pager_page_unswapped 1741c7c3c6aSMatthew Dillon * 1751c7c3c6aSMatthew Dillon * called at splvm() to destroy swap associated with the page. 1761c7c3c6aSMatthew Dillon * 1771c7c3c6aSMatthew Dillon * This function may not block. 1781c7c3c6aSMatthew Dillon */ 1791c7c3c6aSMatthew Dillon static __inline void 1801c7c3c6aSMatthew Dillon vm_pager_page_unswapped(vm_page_t m) 1811c7c3c6aSMatthew Dillon { 1820cddd8f0SMatthew Dillon GIANT_REQUIRED; 1831c7c3c6aSMatthew Dillon if (pagertab[m->object->type]->pgo_pageunswapped) 1841c7c3c6aSMatthew Dillon (*pagertab[m->object->type]->pgo_pageunswapped)(m); 1851c7c3c6aSMatthew Dillon } 1861c7c3c6aSMatthew Dillon 187a1287949SEivind Eklund #endif /* _KERNEL */ 188df8bae1dSRodney W. Grimes #endif /* _VM_PAGER_ */ 189