vm_object.h revision 132550
118334Speter/* 218334Speter * Copyright (c) 1991, 1993 318334Speter * The Regents of the University of California. All rights reserved. 418334Speter * 550397Sobrien * This code is derived from software contributed to Berkeley by 618334Speter * The Mach Operating System project at Carnegie-Mellon University. 718334Speter * 818334Speter * Redistribution and use in source and binary forms, with or without 918334Speter * modification, are permitted provided that the following conditions 1018334Speter * are met: 1118334Speter * 1. Redistributions of source code must retain the above copyright 1218334Speter * notice, this list of conditions and the following disclaimer. 1318334Speter * 2. Redistributions in binary form must reproduce the above copyright 1418334Speter * notice, this list of conditions and the following disclaimer in the 1518334Speter * documentation and/or other materials provided with the distribution. 1618334Speter * 4. Neither the name of the University nor the names of its contributors 1718334Speter * may be used to endorse or promote products derived from this software 1818334Speter * without specific prior written permission. 1918334Speter * 2018334Speter * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2118334Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2218334Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2318334Speter * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2418334Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2518334Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2650397Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2750397Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2850397Sobrien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2950397Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3050397Sobrien * SUCH DAMAGE. 3150397Sobrien * 3218334Speter * from: @(#)vm_object.h 8.3 (Berkeley) 1/12/94 3318334Speter * 3418334Speter * 3518334Speter * Copyright (c) 1987, 1990 Carnegie-Mellon University. 3618334Speter * All rights reserved. 3718334Speter * 3818334Speter * Authors: Avadis Tevanian, Jr., Michael Wayne Young 3918334Speter * 4018334Speter * Permission to use, copy, modify and distribute this software and 4150397Sobrien * its documentation is hereby granted, provided that both the copyright 4250397Sobrien * notice and this permission notice appear in all copies of the 4350397Sobrien * software, derivative works or modified versions, and any portions 4418334Speter * thereof, and that both notices appear in supporting documentation. 4518334Speter * 4618334Speter * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 4718334Speter * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND 4818334Speter * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 4918334Speter * 5018334Speter * Carnegie Mellon requests users of this software to return to 5118334Speter * 5218334Speter * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 5318334Speter * School of Computer Science 5450397Sobrien * Carnegie Mellon University 5550397Sobrien * Pittsburgh PA 15213-3890 5650397Sobrien * 5750397Sobrien * any improvements or extensions that they make and grant Carnegie the 5850397Sobrien * rights to redistribute these changes. 5950397Sobrien * 6018334Speter * $FreeBSD: head/sys/vm/vm_object.h 132550 2004-07-22 19:44:49Z alc $ 6150397Sobrien */ 6218334Speter 6318334Speter/* 6418334Speter * Virtual memory object module definitions. 6518334Speter */ 6618334Speter 6718334Speter#ifndef _VM_OBJECT_ 6818334Speter#define _VM_OBJECT_ 6918334Speter 7018334Speter#include <sys/queue.h> 7118334Speter#include <sys/_lock.h> 7218334Speter#include <sys/_mutex.h> 7318334Speter 7418334Speterenum obj_type { OBJT_DEFAULT, OBJT_SWAP, OBJT_VNODE, OBJT_DEVICE, OBJT_PHYS, 7518334Speter OBJT_DEAD }; 7618334Spetertypedef u_char objtype_t; 7718334Speter 7818334Speter/* 7918334Speter * Types defined: 8018334Speter * 8118334Speter * vm_object_t Virtual memory object. 8218334Speter * 8318334Speter * List of locks 8418334Speter * (c) const until freed 8518334Speter * 8618334Speter */ 8718334Speter 8818334Speterstruct vm_object { 8918334Speter struct mtx mtx; 9018334Speter TAILQ_ENTRY(vm_object) object_list; /* list of all objects */ 9118334Speter LIST_HEAD(, vm_object) shadow_head; /* objects that this is a shadow for */ 9218334Speter LIST_ENTRY(vm_object) shadow_list; /* chain of shadow objects */ 9318334Speter TAILQ_HEAD(, vm_page) memq; /* list of resident pages */ 9418334Speter vm_page_t root; /* root of the resident page splay tree */ 9518334Speter vm_pindex_t size; /* Object size */ 9618334Speter int generation; /* generation ID */ 9718334Speter int ref_count; /* How many refs?? */ 9818334Speter int shadow_count; /* how many objects that this is a shadow for */ 9950397Sobrien objtype_t type; /* type of pager */ 10018334Speter u_short flags; /* see below */ 10118334Speter u_short pg_color; /* (c) color of first page in obj */ 10218334Speter u_short paging_in_progress; /* Paging (in or out) so don't collapse or destroy */ 10318334Speter int resident_page_count; /* number of resident pages */ 10418334Speter struct vm_object *backing_object; /* object that I'm a shadow of */ 10518334Speter vm_ooffset_t backing_object_offset;/* Offset in backing object */ 10618334Speter TAILQ_ENTRY(vm_object) pager_object_list; /* list of all objects of this pager type */ 10718334Speter void *handle; 10818334Speter union { 10918334Speter /* 11018334Speter * VNode pager 11118334Speter * 11218334Speter * vnp_size - current size of file 11318334Speter */ 11418334Speter struct { 11518334Speter off_t vnp_size; 11618334Speter } vnp; 11718334Speter 11818334Speter /* 11918334Speter * Device pager 12018334Speter * 12150397Sobrien * devp_pglist - list of allocated pages 12218334Speter */ 12318334Speter struct { 12418334Speter TAILQ_HEAD(, vm_page) devp_pglist; 12518334Speter } devp; 12618334Speter 12718334Speter /* 12818334Speter * Swap pager 12918334Speter * 13018334Speter * swp_bcount - number of swap 'swblock' metablocks, each 13118334Speter * contains up to 16 swapblk assignments. 13218334Speter * see vm/swap_pager.h 13318334Speter */ 13418334Speter struct { 13518334Speter int swp_bcount; 13618334Speter } swp; 13718334Speter } un_pager; 13818334Speter}; 13918334Speter 14018334Speter/* 14118334Speter * Flags 14218334Speter */ 14318334Speter#define OBJ_ACTIVE 0x0004 /* active objects */ 14418334Speter#define OBJ_DEAD 0x0008 /* dead objects (during rundown) */ 14518334Speter#define OBJ_NOSPLIT 0x0010 /* dont split this object */ 14618334Speter#define OBJ_PIPWNT 0x0040 /* paging in progress wanted */ 14718334Speter#define OBJ_WRITEABLE 0x0080 /* object has been made writable */ 14818334Speter#define OBJ_MIGHTBEDIRTY 0x0100 /* object might be dirty */ 14918334Speter#define OBJ_CLEANING 0x0200 15018334Speter#define OBJ_ONEMAPPING 0x2000 /* One USE (a single, non-forked) mapping flag */ 15118334Speter 15218334Speter#define IDX_TO_OFF(idx) (((vm_ooffset_t)(idx)) << PAGE_SHIFT) 15318334Speter#define OFF_TO_IDX(off) ((vm_pindex_t)(((vm_ooffset_t)(off)) >> PAGE_SHIFT)) 15418334Speter 15518334Speter#ifdef _KERNEL 15618334Speter 15718334Speter#define OBJPC_SYNC 0x1 /* sync I/O */ 15818334Speter#define OBJPC_INVAL 0x2 /* invalidate */ 15918334Speter#define OBJPC_NOSYNC 0x4 /* skip if PG_NOSYNC */ 16018334Speter 16118334SpeterTAILQ_HEAD(object_q, vm_object); 16218334Speter 16318334Speterextern struct object_q vm_object_list; /* list of allocated objects */ 16418334Speterextern struct mtx vm_object_list_mtx; /* lock for object list and count */ 16518334Speter 16618334Speterextern struct vm_object kernel_object_store; 16718334Speterextern struct vm_object kmem_object_store; 16818334Speter 16918334Speter#define kernel_object (&kernel_object_store) 17018334Speter#define kmem_object (&kmem_object_store) 17118334Speter 17218334Speter#define VM_OBJECT_LOCK(object) mtx_lock(&(object)->mtx) 17318334Speter#define VM_OBJECT_LOCK_ASSERT(object, type) \ 17418334Speter mtx_assert(&(object)->mtx, (type)) 17518334Speter#define VM_OBJECT_LOCK_INIT(object, type) \ 17618334Speter mtx_init(&(object)->mtx, "vm object", \ 17718334Speter (type), MTX_DEF | MTX_DUPOK) 17818334Speter#define VM_OBJECT_LOCKED(object) mtx_owned(&(object)->mtx) 17918334Speter#define VM_OBJECT_MTX(object) (&(object)->mtx) 18018334Speter#define VM_OBJECT_TRYLOCK(object) mtx_trylock(&(object)->mtx) 18118334Speter#define VM_OBJECT_UNLOCK(object) mtx_unlock(&(object)->mtx) 18218334Speter 18318334Speter/* 18418334Speter * The object must be locked or thread private. 18518334Speter */ 18618334Speterstatic __inline void 18718334Spetervm_object_set_flag(vm_object_t object, u_short bits) 18818334Speter{ 18918334Speter 19018334Speter object->flags |= bits; 19118334Speter} 19218334Speter 19318334Spetervoid vm_object_clear_flag(vm_object_t object, u_short bits); 19418334Spetervoid vm_object_pip_add(vm_object_t object, short i); 19518334Spetervoid vm_object_pip_subtract(vm_object_t object, short i); 19618334Spetervoid vm_object_pip_wakeup(vm_object_t object); 19718334Spetervoid vm_object_pip_wakeupn(vm_object_t object, short i); 19818334Spetervoid vm_object_pip_wait(vm_object_t object, char *waitid); 19918334Speter 20018334Spetervm_object_t vm_object_allocate (objtype_t, vm_pindex_t); 20118334Spetervm_object_t vm_object_allocate_wait (objtype_t, vm_pindex_t, int); 20218334Spetervoid _vm_object_allocate (objtype_t, vm_pindex_t, vm_object_t); 20318334Speterboolean_t vm_object_coalesce (vm_object_t, vm_pindex_t, vm_size_t, vm_size_t); 20418334Spetervoid vm_object_collapse (vm_object_t); 20518334Spetervoid vm_object_deallocate (vm_object_t); 20618334Spetervoid vm_object_terminate (vm_object_t); 20750397Sobrienvoid vm_object_vndeallocate (vm_object_t); 20818334Spetervoid vm_object_set_writeable_dirty (vm_object_t); 20950397Sobrienvoid vm_object_init (void); 21050397Sobrienvoid vm_object_page_clean (vm_object_t, vm_pindex_t, vm_pindex_t, boolean_t); 21150397Sobrienvoid vm_object_page_remove (vm_object_t, vm_pindex_t, vm_pindex_t, boolean_t); 21250397Sobrienvoid vm_object_reference (vm_object_t); 21350397Sobrienvoid vm_object_reference_locked(vm_object_t); 21450397Sobrienvoid vm_object_shadow (vm_object_t *, vm_ooffset_t *, vm_size_t); 21550397Sobrienvoid vm_object_split(vm_map_entry_t); 21650397Sobrienvoid vm_object_sync(vm_object_t, vm_ooffset_t, vm_size_t, boolean_t, 21750397Sobrien boolean_t); 21850397Sobrienvoid vm_object_madvise (vm_object_t, vm_pindex_t, int, int); 21950397Sobrien#endif /* _KERNEL */ 22018334Speter 22150397Sobrien#endif /* _VM_OBJECT_ */ 22250397Sobrien