vm_object.h revision 12820
168651Skris/* 268651Skris * Copyright (c) 1991, 1993 368651Skris * The Regents of the University of California. All rights reserved. 468651Skris * 568651Skris * This code is derived from software contributed to Berkeley by 668651Skris * The Mach Operating System project at Carnegie-Mellon University. 768651Skris * 868651Skris * Redistribution and use in source and binary forms, with or without 968651Skris * modification, are permitted provided that the following conditions 1068651Skris * are met: 1168651Skris * 1. Redistributions of source code must retain the above copyright 1268651Skris * notice, this list of conditions and the following disclaimer. 1368651Skris * 2. Redistributions in binary form must reproduce the above copyright 1468651Skris * notice, this list of conditions and the following disclaimer in the 1568651Skris * documentation and/or other materials provided with the distribution. 1668651Skris * 3. All advertising materials mentioning features or use of this software 1768651Skris * must display the following acknowledgement: 1868651Skris * This product includes software developed by the University of 1968651Skris * California, Berkeley and its contributors. 2068651Skris * 4. Neither the name of the University nor the names of its contributors 2168651Skris * may be used to endorse or promote products derived from this software 2268651Skris * without specific prior written permission. 2368651Skris * 2468651Skris * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2568651Skris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2668651Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2768651Skris * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2868651Skris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2968651Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3068651Skris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3168651Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3268651Skris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33109998Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34109998Smarkm * SUCH DAMAGE. 3568651Skris * 3668651Skris * from: @(#)vm_object.h 8.3 (Berkeley) 1/12/94 3768651Skris * 3868651Skris * 3968651Skris * Copyright (c) 1987, 1990 Carnegie-Mellon University. 4068651Skris * All rights reserved. 4168651Skris * 4268651Skris * Authors: Avadis Tevanian, Jr., Michael Wayne Young 4368651Skris * 4468651Skris * Permission to use, copy, modify and distribute this software and 4568651Skris * its documentation is hereby granted, provided that both the copyright 4668651Skris * notice and this permission notice appear in all copies of the 4768651Skris * software, derivative works or modified versions, and any portions 4868651Skris * thereof, and that both notices appear in supporting documentation. 4968651Skris * 5068651Skris * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 5168651Skris * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND 5268651Skris * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 5368651Skris * 5468651Skris * Carnegie Mellon requests users of this software to return to 5568651Skris * 5668651Skris * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 5768651Skris * School of Computer Science 5868651Skris * Carnegie Mellon University 5968651Skris * Pittsburgh PA 15213-3890 6068651Skris * 6168651Skris * any improvements or extensions that they make and grant Carnegie the 6268651Skris * rights to redistribute these changes. 6368651Skris * 6468651Skris * $Id: vm_object.h,v 1.25 1995/12/11 04:58:23 dyson Exp $ 6568651Skris */ 6668651Skris 6768651Skris/* 6868651Skris * Virtual memory object module definitions. 6968651Skris */ 7068651Skris 7168651Skris#ifndef _VM_OBJECT_ 7268651Skris#define _VM_OBJECT_ 7368651Skris 7468651Skris#ifdef KERNEL 7568651Skris#include <sys/proc.h> /* XXX for wakeup() */ 7668651Skris#endif 7768651Skris 7868651Skrisenum obj_type { OBJT_DEFAULT, OBJT_SWAP, OBJT_VNODE, OBJT_DEVICE }; 7968651Skristypedef enum obj_type objtype_t; 8068651Skris 8168651Skris/* 8268651Skris * Types defined: 8368651Skris * 8468651Skris * vm_object_t Virtual memory object. 8568651Skris */ 8668651Skris 8768651Skrisstruct vm_object { 8868651Skris TAILQ_ENTRY(vm_object) object_list; /* list of all objects */ 8968651Skris TAILQ_ENTRY(vm_object) cached_list; /* list of cached (persistent) objects */ 9068651Skris TAILQ_HEAD(, vm_object) shadow_head; /* objects that this is a shadow for */ 9168651Skris TAILQ_ENTRY(vm_object) shadow_list; /* chain of shadow objects */ 9268651Skris TAILQ_HEAD(, vm_page) memq; /* list of resident pages */ 9368651Skris objtype_t type; /* type of pager */ 9468651Skris vm_size_t size; /* Object size */ 9568651Skris int ref_count; /* How many refs?? */ 9668651Skris u_short flags; /* see below */ 9768651Skris u_short paging_in_progress; /* Paging (in or out) so don't collapse or destroy */ 9868651Skris int resident_page_count; /* number of resident pages */ 9968651Skris vm_ooffset_t paging_offset; /* Offset into paging space */ 10068651Skris struct vm_object *backing_object; /* object that I'm a shadow of */ 10168651Skris vm_ooffset_t backing_object_offset;/* Offset in backing object */ 10268651Skris vm_offset_t last_read; /* last read in object -- detect seq behavior */ 10368651Skris TAILQ_ENTRY(vm_object) pager_object_list; /* list of all objects of this pager type */ 10468651Skris void *handle; 10568651Skris union { 10668651Skris struct { 10768651Skris off_t vnp_size; /* Current size of file */ 10868651Skris } vnp; 10968651Skris struct { 11068651Skris TAILQ_HEAD(, vm_page) devp_pglist; /* list of pages allocated */ 11168651Skris } devp; 11268651Skris struct { 11368651Skris int swp_nblocks; 11468651Skris int swp_allocsize; 11568651Skris struct swblock *swp_blocks; 11668651Skris short swp_poip; 11768651Skris } swp; 11868651Skris } un_pager; 11968651Skris}; 12068651Skris 12168651Skris/* 12268651Skris * Flags 12368651Skris */ 12468651Skris#define OBJ_CANPERSIST 0x0001 /* allow to persist */ 12568651Skris#define OBJ_ACTIVE 0x0004 /* active objects */ 12668651Skris#define OBJ_DEAD 0x0008 /* dead objects (during rundown) */ 12768651Skris#define OBJ_PIPWNT 0x0040 /* paging in progress wanted */ 12868651Skris#define OBJ_WRITEABLE 0x0080 /* object has been made writable */ 12968651Skris#define OBJ_MIGHTBEDIRTY 0x0100 /* object might be dirty */ 13068651Skris#define OBJ_CLEANING 0x0200 13168651Skris 13268651Skris#define IDX_TO_OFF(idx) (((vm_ooffset_t)(idx)) << PAGE_SHIFT) 13368651Skris#define OFF_TO_IDX(off) ((vm_pindex_t)(((vm_ooffset_t)(off)) >> PAGE_SHIFT)) 13468651Skris 13568651Skris#ifdef KERNEL 13668651Skrisextern int vm_object_cache_max; 13768651Skris 13868651SkrisTAILQ_HEAD(object_q, vm_object); 13968651Skris 14068651Skrisextern struct object_q vm_object_cached_list; /* list of objects persisting */ 14168651Skrisextern int vm_object_cached; /* size of cached list */ 14268651Skris 14368651Skrisextern struct object_q vm_object_list; /* list of allocated objects */ 14468651Skrisextern long vm_object_count; /* count of all objects */ 14568651Skris 14668651Skris /* lock for object list and count */ 14768651Skris 14868651Skrisextern vm_object_t kernel_object; /* the single kernel object */ 14968651Skrisextern vm_object_t kmem_object; 15068651Skris 15168651Skris#endif /* KERNEL */ 15268651Skris 15368651Skris#ifdef KERNEL 15468651Skrisstatic __inline void 15568651Skrisvm_object_pip_wakeup(vm_object_t object) 15668651Skris{ 15768651Skris object->paging_in_progress--; 15868651Skris if ((object->flags & OBJ_PIPWNT) && object->paging_in_progress == 0) { 15968651Skris object->flags &= ~OBJ_PIPWNT; 16068651Skris wakeup(object); 16168651Skris } 16268651Skris} 16368651Skris 16468651Skrisvm_object_t vm_object_allocate __P((objtype_t, vm_size_t)); 16568651Skrisvoid vm_object_cache_clear __P((void)); 16668651Skrisboolean_t vm_object_coalesce __P((vm_object_t, vm_pindex_t, vm_size_t, vm_size_t)); 16768651Skrisvoid vm_object_collapse __P((vm_object_t)); 16868651Skrisvoid vm_object_copy __P((vm_object_t, vm_pindex_t, vm_object_t *, vm_pindex_t *, boolean_t *)); 16968651Skrisvoid vm_object_deallocate __P((vm_object_t)); 17068651Skrisvoid vm_object_init __P((void)); 17168651Skrisvoid vm_object_page_clean __P((vm_object_t, vm_pindex_t, vm_pindex_t, boolean_t, boolean_t)); 17268651Skrisvoid vm_object_page_remove __P((vm_object_t, vm_pindex_t, vm_pindex_t, boolean_t)); 17368651Skrisvoid vm_object_pmap_copy __P((vm_object_t, vm_pindex_t, vm_pindex_t)); 17468651Skrisvoid vm_object_pmap_remove __P((vm_object_t, vm_pindex_t, vm_pindex_t)); 17568651Skrisvoid vm_object_reference __P((vm_object_t)); 17668651Skrisvoid vm_object_shadow __P((vm_object_t *, vm_ooffset_t *, vm_size_t)); 17768651Skris#endif /* KERNEL */ 17868651Skris 17968651Skris#endif /* _VM_OBJECT_ */ 18068651Skris