vm_object.h revision 98824
1258299Sjmmv/* 2258299Sjmmv * Copyright (c) 1991, 1993 3258299Sjmmv * The Regents of the University of California. All rights reserved. 4258299Sjmmv * 5258299Sjmmv * This code is derived from software contributed to Berkeley by 6258299Sjmmv * The Mach Operating System project at Carnegie-Mellon University. 7258299Sjmmv * 8258299Sjmmv * Redistribution and use in source and binary forms, with or without 9258299Sjmmv * modification, are permitted provided that the following conditions 10258299Sjmmv * are met: 11258299Sjmmv * 1. Redistributions of source code must retain the above copyright 12258299Sjmmv * notice, this list of conditions and the following disclaimer. 13258299Sjmmv * 2. Redistributions in binary form must reproduce the above copyright 14258299Sjmmv * notice, this list of conditions and the following disclaimer in the 15258299Sjmmv * documentation and/or other materials provided with the distribution. 16258299Sjmmv * 3. All advertising materials mentioning features or use of this software 17258299Sjmmv * must display the following acknowledgement: 18258299Sjmmv * This product includes software developed by the University of 19258299Sjmmv * California, Berkeley and its contributors. 20258299Sjmmv * 4. Neither the name of the University nor the names of its contributors 21258299Sjmmv * may be used to endorse or promote products derived from this software 22258299Sjmmv * without specific prior written permission. 23258299Sjmmv * 24258299Sjmmv * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25258299Sjmmv * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26258299Sjmmv * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27258299Sjmmv * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28258299Sjmmv * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29258299Sjmmv * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30258299Sjmmv * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31258299Sjmmv * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32258299Sjmmv * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33258299Sjmmv * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34258299Sjmmv * SUCH DAMAGE. 35258299Sjmmv * 36258299Sjmmv * from: @(#)vm_object.h 8.3 (Berkeley) 1/12/94 37258299Sjmmv * 38258299Sjmmv * 39258299Sjmmv * Copyright (c) 1987, 1990 Carnegie-Mellon University. 40258299Sjmmv * All rights reserved. 41258299Sjmmv * 42258299Sjmmv * Authors: Avadis Tevanian, Jr., Michael Wayne Young 43258299Sjmmv * 44258299Sjmmv * Permission to use, copy, modify and distribute this software and 45258299Sjmmv * its documentation is hereby granted, provided that both the copyright 46258299Sjmmv * notice and this permission notice appear in all copies of the 47258299Sjmmv * software, derivative works or modified versions, and any portions 48258299Sjmmv * thereof, and that both notices appear in supporting documentation. 49258299Sjmmv * 50258299Sjmmv * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 51258299Sjmmv * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND 52258299Sjmmv * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 53258299Sjmmv * 54258299Sjmmv * Carnegie Mellon requests users of this software to return to 55258299Sjmmv * 56258299Sjmmv * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 57258299Sjmmv * School of Computer Science 58258299Sjmmv * Carnegie Mellon University 59258299Sjmmv * Pittsburgh PA 15213-3890 60258299Sjmmv * 61258299Sjmmv * any improvements or extensions that they make and grant Carnegie the 62258299Sjmmv * rights to redistribute these changes. 63258299Sjmmv * 64258299Sjmmv * $FreeBSD: head/sys/vm/vm_object.h 98824 2002-06-25 22:14:06Z iedowse $ 65258299Sjmmv */ 66258299Sjmmv 67258299Sjmmv/* 68258299Sjmmv * Virtual memory object module definitions. 69258299Sjmmv */ 70258299Sjmmv 71258299Sjmmv#ifndef _VM_OBJECT_ 72258299Sjmmv#define _VM_OBJECT_ 73258299Sjmmv 74258299Sjmmv#include <sys/queue.h> 75258299Sjmmv 76258299Sjmmvenum obj_type { OBJT_DEFAULT, OBJT_SWAP, OBJT_VNODE, OBJT_DEVICE, OBJT_PHYS, 77258299Sjmmv OBJT_DEAD }; 78258299Sjmmvtypedef u_char objtype_t; 79258299Sjmmv 80258299Sjmmv/* 81258299Sjmmv * Types defined: 82258299Sjmmv * 83258299Sjmmv * vm_object_t Virtual memory object. 84258299Sjmmv * 85258299Sjmmv * List of locks 86258299Sjmmv * (c) const until freed 87258299Sjmmv * 88258299Sjmmv */ 89258299Sjmmv 90258299Sjmmvstruct vm_object { 91258299Sjmmv TAILQ_ENTRY(vm_object) object_list; /* list of all objects */ 92258299Sjmmv TAILQ_HEAD(, vm_object) shadow_head; /* objects that this is a shadow for */ 93258299Sjmmv TAILQ_ENTRY(vm_object) shadow_list; /* chain of shadow objects */ 94258299Sjmmv TAILQ_HEAD(, vm_page) memq; /* list of resident pages */ 95258299Sjmmv int generation; /* generation ID */ 96258299Sjmmv vm_pindex_t size; /* Object size */ 97258299Sjmmv int ref_count; /* How many refs?? */ 98258299Sjmmv int shadow_count; /* how many objects that this is a shadow for */ 99258299Sjmmv int hash_rand; /* (c) hash table randomizer */ 100258299Sjmmv objtype_t type; /* type of pager */ 101258299Sjmmv u_short flags; /* see below */ 102258299Sjmmv u_short pg_color; /* (c) color of first page in obj */ 103258299Sjmmv u_short paging_in_progress; /* Paging (in or out) so don't collapse or destroy */ 104258299Sjmmv int resident_page_count; /* number of resident pages */ 105258299Sjmmv struct vm_object *backing_object; /* object that I'm a shadow of */ 106258299Sjmmv vm_ooffset_t backing_object_offset;/* Offset in backing object */ 107258299Sjmmv TAILQ_ENTRY(vm_object) pager_object_list; /* list of all objects of this pager type */ 108258299Sjmmv void *handle; 109258299Sjmmv union { 110258299Sjmmv /* 111258299Sjmmv * VNode pager 112258299Sjmmv * 113258299Sjmmv * vnp_size - current size of file 114258299Sjmmv */ 115258299Sjmmv struct { 116258299Sjmmv off_t vnp_size; 117258299Sjmmv } vnp; 118258299Sjmmv 119258299Sjmmv /* 120258299Sjmmv * Device pager 121258299Sjmmv * 122258299Sjmmv * devp_pglist - list of allocated pages 123258299Sjmmv */ 124258299Sjmmv struct { 125258299Sjmmv TAILQ_HEAD(, vm_page) devp_pglist; 126258299Sjmmv } devp; 127258299Sjmmv 128258299Sjmmv /* 129258299Sjmmv * Swap pager 130258299Sjmmv * 131258299Sjmmv * swp_bcount - number of swap 'swblock' metablocks, each 132258299Sjmmv * contains up to 16 swapblk assignments. 133258299Sjmmv * see vm/swap_pager.h 134258299Sjmmv */ 135258299Sjmmv struct { 136258299Sjmmv int swp_bcount; 137258299Sjmmv } swp; 138258299Sjmmv } un_pager; 139258299Sjmmv}; 140258299Sjmmv 141258299Sjmmv/* 142258299Sjmmv * Flags 143258299Sjmmv */ 144258299Sjmmv#define OBJ_ACTIVE 0x0004 /* active objects */ 145258299Sjmmv#define OBJ_DEAD 0x0008 /* dead objects (during rundown) */ 146258299Sjmmv#define OBJ_NOSPLIT 0x0010 /* dont split this object */ 147258299Sjmmv#define OBJ_PIPWNT 0x0040 /* paging in progress wanted */ 148258299Sjmmv#define OBJ_WRITEABLE 0x0080 /* object has been made writable */ 149258299Sjmmv#define OBJ_MIGHTBEDIRTY 0x0100 /* object might be dirty */ 150258299Sjmmv#define OBJ_CLEANING 0x0200 151258299Sjmmv#define OBJ_OPT 0x1000 /* I/O optimization */ 152258299Sjmmv#define OBJ_ONEMAPPING 0x2000 /* One USE (a single, non-forked) mapping flag */ 153258299Sjmmv 154258299Sjmmv#define IDX_TO_OFF(idx) (((vm_ooffset_t)(idx)) << PAGE_SHIFT) 155292485Sngie#define OFF_TO_IDX(off) ((vm_pindex_t)(((vm_ooffset_t)(off)) >> PAGE_SHIFT)) 156292485Sngie 157258299Sjmmv#ifdef _KERNEL 158 159#define OBJPC_SYNC 0x1 /* sync I/O */ 160#define OBJPC_INVAL 0x2 /* invalidate */ 161#define OBJPC_NOSYNC 0x4 /* skip if PG_NOSYNC */ 162 163TAILQ_HEAD(object_q, vm_object); 164 165extern struct object_q vm_object_list; /* list of allocated objects */ 166extern struct mtx vm_object_list_mtx; /* lock for object list and count */ 167 168extern vm_object_t kernel_object; /* the single kernel object */ 169extern vm_object_t kmem_object; 170 171#endif /* _KERNEL */ 172 173#ifdef _KERNEL 174void vm_freeze_copyopts(vm_object_t, vm_pindex_t, vm_pindex_t); 175 176void vm_object_set_flag(vm_object_t object, u_short bits); 177void vm_object_clear_flag(vm_object_t object, u_short bits); 178void vm_object_pip_add(vm_object_t object, short i); 179void vm_object_pip_subtract(vm_object_t object, short i); 180void vm_object_pip_wakeup(vm_object_t object); 181void vm_object_pip_wakeupn(vm_object_t object, short i); 182void vm_object_pip_sleep(vm_object_t object, char *waitid); 183void vm_object_pip_wait(vm_object_t object, char *waitid); 184 185vm_object_t vm_object_allocate (objtype_t, vm_pindex_t); 186void _vm_object_allocate (objtype_t, vm_pindex_t, vm_object_t); 187boolean_t vm_object_coalesce (vm_object_t, vm_pindex_t, vm_size_t, vm_size_t); 188void vm_object_collapse (vm_object_t); 189void vm_object_deallocate (vm_object_t); 190void vm_object_terminate (vm_object_t); 191void vm_object_vndeallocate (vm_object_t); 192void vm_object_set_writeable_dirty (vm_object_t); 193void vm_object_init (void); 194void vm_object_page_clean (vm_object_t, vm_pindex_t, vm_pindex_t, boolean_t); 195void vm_object_page_remove (vm_object_t, vm_pindex_t, vm_pindex_t, boolean_t); 196void vm_object_pmap_copy (vm_object_t, vm_pindex_t, vm_pindex_t); 197void vm_object_pmap_copy_1 (vm_object_t, vm_pindex_t, vm_pindex_t); 198void vm_object_pmap_remove (vm_object_t, vm_pindex_t, vm_pindex_t); 199void vm_object_reference (vm_object_t); 200void vm_object_shadow (vm_object_t *, vm_ooffset_t *, vm_size_t); 201void vm_object_split(vm_map_entry_t); 202void vm_object_madvise (vm_object_t, vm_pindex_t, int, int); 203void vm_object_init2 (void); 204#endif /* _KERNEL */ 205 206#endif /* _VM_OBJECT_ */ 207