vm_object.h revision 113838
1169695Skan/* 2169695Skan * Copyright (c) 1991, 1993 3169695Skan * The Regents of the University of California. All rights reserved. 4169695Skan * 5169695Skan * This code is derived from software contributed to Berkeley by 6169695Skan * The Mach Operating System project at Carnegie-Mellon University. 7169695Skan * 8169695Skan * Redistribution and use in source and binary forms, with or without 9169695Skan * modification, are permitted provided that the following conditions 10169695Skan * are met: 11169695Skan * 1. Redistributions of source code must retain the above copyright 12169695Skan * notice, this list of conditions and the following disclaimer. 13169695Skan * 2. Redistributions in binary form must reproduce the above copyright 14169695Skan * notice, this list of conditions and the following disclaimer in the 15169695Skan * documentation and/or other materials provided with the distribution. 16169695Skan * 3. All advertising materials mentioning features or use of this software 17169695Skan * must display the following acknowledgement: 18169695Skan * This product includes software developed by the University of 19169695Skan * California, Berkeley and its contributors. 20169695Skan * 4. Neither the name of the University nor the names of its contributors 21169695Skan * may be used to endorse or promote products derived from this software 22169695Skan * without specific prior written permission. 23169695Skan * 24169695Skan * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25169695Skan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26169695Skan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27169695Skan * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28169695Skan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29169695Skan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30169695Skan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31169695Skan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32169695Skan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33169695Skan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34169695Skan * SUCH DAMAGE. 35169695Skan * 36169695Skan * from: @(#)vm_object.h 8.3 (Berkeley) 1/12/94 37169695Skan * 38169695Skan * 39169695Skan * Copyright (c) 1987, 1990 Carnegie-Mellon University. 40169695Skan * All rights reserved. 41169695Skan * 42169695Skan * Authors: Avadis Tevanian, Jr., Michael Wayne Young 43169695Skan * 44169695Skan * Permission to use, copy, modify and distribute this software and 45169695Skan * its documentation is hereby granted, provided that both the copyright 46169695Skan * notice and this permission notice appear in all copies of the 47169695Skan * software, derivative works or modified versions, and any portions 48169695Skan * thereof, and that both notices appear in supporting documentation. 49169695Skan * 50169695Skan * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 51169695Skan * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND 52169695Skan * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 53169695Skan * 54169695Skan * Carnegie Mellon requests users of this software to return to 55169695Skan * 56169695Skan * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 57169695Skan * School of Computer Science 58169695Skan * Carnegie Mellon University 59169695Skan * Pittsburgh PA 15213-3890 60169695Skan * 61169695Skan * any improvements or extensions that they make and grant Carnegie the 62169695Skan * rights to redistribute these changes. 63169695Skan * 64169695Skan * $FreeBSD: head/sys/vm/vm_object.h 113838 2003-04-22 04:47:29Z alc $ 65169695Skan */ 66169695Skan 67169695Skan/* 68169695Skan * Virtual memory object module definitions. 69169695Skan */ 70169695Skan 71169695Skan#ifndef _VM_OBJECT_ 72169695Skan#define _VM_OBJECT_ 73169695Skan 74169695Skan#include <sys/queue.h> 75169695Skan#include <sys/_lock.h> 76169695Skan#include <sys/_mutex.h> 77169695Skan 78169695Skanenum obj_type { OBJT_DEFAULT, OBJT_SWAP, OBJT_VNODE, OBJT_DEVICE, OBJT_PHYS, 79169695Skan OBJT_DEAD }; 80169695Skantypedef u_char objtype_t; 81169695Skan 82169695Skan/* 83169695Skan * Types defined: 84169695Skan * 85169695Skan * vm_object_t Virtual memory object. 86169695Skan * 87169695Skan * List of locks 88169695Skan * (c) const until freed 89169695Skan * 90169695Skan */ 91169695Skan 92169695Skanstruct vm_object { 93169695Skan struct mtx mtx; 94169695Skan TAILQ_ENTRY(vm_object) object_list; /* list of all objects */ 95169695Skan TAILQ_HEAD(, vm_object) shadow_head; /* objects that this is a shadow for */ 96169695Skan TAILQ_ENTRY(vm_object) shadow_list; /* chain of shadow objects */ 97169695Skan TAILQ_HEAD(, vm_page) memq; /* list of resident pages */ 98169695Skan vm_page_t root; /* root of the resident page splay tree */ 99169695Skan int generation; /* generation ID */ 100169695Skan vm_pindex_t size; /* Object size */ 101169695Skan int ref_count; /* How many refs?? */ 102169695Skan int shadow_count; /* how many objects that this is a shadow for */ 103169695Skan objtype_t type; /* type of pager */ 104169695Skan u_short flags; /* see below */ 105169695Skan u_short pg_color; /* (c) color of first page in obj */ 106169695Skan u_short paging_in_progress; /* Paging (in or out) so don't collapse or destroy */ 107169695Skan int resident_page_count; /* number of resident pages */ 108169695Skan struct vm_object *backing_object; /* object that I'm a shadow of */ 109169695Skan vm_ooffset_t backing_object_offset;/* Offset in backing object */ 110169695Skan TAILQ_ENTRY(vm_object) pager_object_list; /* list of all objects of this pager type */ 111169695Skan void *handle; 112169695Skan union { 113169695Skan /* 114169695Skan * VNode pager 115169695Skan * 116169695Skan * vnp_size - current size of file 117169695Skan */ 118169695Skan struct { 119169695Skan off_t vnp_size; 120169695Skan } vnp; 121169695Skan 122169695Skan /* 123169695Skan * Device pager 124169695Skan * 125169695Skan * devp_pglist - list of allocated pages 126169695Skan */ 127169695Skan struct { 128169695Skan TAILQ_HEAD(, vm_page) devp_pglist; 129169695Skan } devp; 130169695Skan 131169695Skan /* 132169695Skan * Swap pager 133169695Skan * 134169695Skan * swp_bcount - number of swap 'swblock' metablocks, each 135169695Skan * contains up to 16 swapblk assignments. 136169695Skan * see vm/swap_pager.h 137169695Skan */ 138169695Skan struct { 139169695Skan int swp_bcount; 140169695Skan } swp; 141169695Skan } un_pager; 142169695Skan}; 143169695Skan 144169695Skan/* 145169695Skan * Flags 146169695Skan */ 147169695Skan#define OBJ_ACTIVE 0x0004 /* active objects */ 148169695Skan#define OBJ_DEAD 0x0008 /* dead objects (during rundown) */ 149169695Skan#define OBJ_NOSPLIT 0x0010 /* dont split this object */ 150169695Skan#define OBJ_PIPWNT 0x0040 /* paging in progress wanted */ 151169695Skan#define OBJ_WRITEABLE 0x0080 /* object has been made writable */ 152169695Skan#define OBJ_MIGHTBEDIRTY 0x0100 /* object might be dirty */ 153169695Skan#define OBJ_CLEANING 0x0200 154169695Skan#define OBJ_ONEMAPPING 0x2000 /* One USE (a single, non-forked) mapping flag */ 155169695Skan 156169695Skan#define IDX_TO_OFF(idx) (((vm_ooffset_t)(idx)) << PAGE_SHIFT) 157169695Skan#define OFF_TO_IDX(off) ((vm_pindex_t)(((vm_ooffset_t)(off)) >> PAGE_SHIFT)) 158169695Skan 159169695Skan#ifdef _KERNEL 160169695Skan 161169695Skan#define OBJPC_SYNC 0x1 /* sync I/O */ 162169695Skan#define OBJPC_INVAL 0x2 /* invalidate */ 163169695Skan#define OBJPC_NOSYNC 0x4 /* skip if PG_NOSYNC */ 164169695Skan 165169695SkanTAILQ_HEAD(object_q, vm_object); 166169695Skan 167169695Skanextern struct object_q vm_object_list; /* list of allocated objects */ 168169695Skanextern struct mtx vm_object_list_mtx; /* lock for object list and count */ 169169695Skan 170169695Skanextern vm_object_t kernel_object; /* the single kernel object */ 171169695Skanextern vm_object_t kmem_object; 172169695Skan 173169695Skan#define VM_OBJECT_LOCK(object) mtx_lock(&(object)->mtx) 174169695Skan#define VM_OBJECT_LOCK_ASSERT(object, type) \ 175169695Skan mtx_assert(&(object)->mtx, (type)) 176169695Skan#define VM_OBJECT_LOCKED(object) mtx_owned(&(object)->mtx) 177169695Skan#define VM_OBJECT_UNLOCK(object) mtx_unlock(&(object)->mtx) 178169695Skan 179169695Skan#define vm_object_lock(object) \ 180169695Skan mtx_lock((object) == kmem_object ? &kmem_object->mtx : &Giant) 181169695Skan#define vm_object_unlock(object) \ 182169695Skan mtx_unlock((object) == kmem_object ? &kmem_object->mtx : &Giant) 183169695Skan 184169695Skanvoid vm_object_set_flag(vm_object_t object, u_short bits); 185169695Skanvoid vm_object_clear_flag(vm_object_t object, u_short bits); 186169695Skanvoid vm_object_pip_add(vm_object_t object, short i); 187169695Skanvoid vm_object_pip_subtract(vm_object_t object, short i); 188169695Skanvoid vm_object_pip_wakeup(vm_object_t object); 189169695Skanvoid vm_object_pip_wakeupn(vm_object_t object, short i); 190169695Skanvoid vm_object_pip_sleep(vm_object_t object, char *waitid); 191169695Skanvoid vm_object_pip_wait(vm_object_t object, char *waitid); 192169695Skan 193169695Skanvm_object_t vm_object_allocate (objtype_t, vm_pindex_t); 194169695Skanvm_object_t vm_object_allocate_wait (objtype_t, vm_pindex_t, int); 195169695Skanvoid _vm_object_allocate (objtype_t, vm_pindex_t, vm_object_t); 196169695Skanboolean_t vm_object_coalesce (vm_object_t, vm_pindex_t, vm_size_t, vm_size_t); 197169695Skanvoid vm_object_collapse (vm_object_t); 198169695Skanvoid vm_object_deallocate (vm_object_t); 199169695Skanvoid vm_object_terminate (vm_object_t); 200169695Skanvoid vm_object_vndeallocate (vm_object_t); 201169695Skanvoid vm_object_set_writeable_dirty (vm_object_t); 202169695Skanvoid vm_object_init (void); 203169695Skanvoid vm_object_page_clean (vm_object_t, vm_pindex_t, vm_pindex_t, boolean_t); 204169695Skanvoid vm_object_page_remove (vm_object_t, vm_pindex_t, vm_pindex_t, boolean_t); 205169695Skanvoid vm_object_reference (vm_object_t); 206169695Skanvoid vm_object_shadow (vm_object_t *, vm_ooffset_t *, vm_size_t); 207169695Skanvoid vm_object_split(vm_map_entry_t); 208169695Skanvoid vm_object_madvise (vm_object_t, vm_pindex_t, int, int); 209169695Skan#endif /* _KERNEL */ 210169695Skan 211169695Skan#endif /* _VM_OBJECT_ */ 212169695Skan