1 /* $OpenBSD: uvm_object.h,v 1.30 2022/09/04 06:49:11 jsg Exp $ */ 2 /* $NetBSD: uvm_object.h,v 1.11 2001/03/09 01:02:12 chs Exp $ */ 3 4 /* 5 * Copyright (c) 1997 Charles D. Cranor and Washington University. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * from: Id: uvm_object.h,v 1.1.2.2 1998/01/04 22:44:51 chuck Exp 29 */ 30 31 #ifndef _UVM_UVM_OBJECT_H_ 32 #define _UVM_UVM_OBJECT_H_ 33 34 /* 35 * The UVM memory object interface. Notes: 36 * 37 * A UVM memory object represents a list of pages, which are managed by 38 * the object's pager operations (uvm_object::pgops). All pages belonging 39 * to an object are owned by it and thus protected by the object lock. 40 * 41 * The lock (uvm_object::vmobjlock) may be shared amongst the UVM objects. 42 * By default, the lock is allocated dynamically using rw_obj_init() cache. 43 * Lock sharing is normally used when there is an underlying object. For 44 * example, vnode representing a file may have an underlying node, which 45 * is the case for tmpfs and layered file systems. In such case, vnode's 46 * UVM object and the underlying UVM object shares the lock. 47 * 48 * The reference count is managed atomically for the anonymous UVM objects. 49 * For other objects, it is arbitrary (may use the lock or atomics). 50 */ 51 52 struct uvm_object { 53 struct rwlock *vmobjlock; /* lock on object */ 54 const struct uvm_pagerops *pgops; /* pager ops */ 55 RBT_HEAD(uvm_objtree, vm_page) memt; /* pages in object */ 56 int uo_npages; /* # of pages in memt */ 57 int uo_refs; /* reference count */ 58 }; 59 60 /* 61 * UVM_OBJ_KERN is a 'special' uo_refs value which indicates that the 62 * object is a kernel memory object rather than a normal one (kernel 63 * memory objects don't have reference counts -- they never die). 64 * 65 * this value is used to detected kernel object mappings at uvm_unmap() 66 * time. normally when an object is unmapped its pages eventually become 67 * deactivated and then paged out and/or freed. this is not useful 68 * for kernel objects... when a kernel object is unmapped we always want 69 * to free the resources associated with the mapping. UVM_OBJ_KERN 70 * allows us to decide which type of unmapping we want to do. 71 * 72 * in addition, we have kernel objects which may be used in an 73 * interrupt context. these objects get their mappings entered 74 * with pmap_kenter*() and removed with pmap_kremove(), which 75 * are safe to call in interrupt context, and must be used ONLY 76 * for wired kernel mappings in these objects and their associated 77 * maps. 78 */ 79 #define UVM_OBJ_KERN (-2) 80 81 #define UVM_OBJ_IS_KERN_OBJECT(uobj) \ 82 ((uobj)->uo_refs == UVM_OBJ_KERN) 83 84 #ifdef _KERNEL 85 86 extern const struct uvm_pagerops uvm_vnodeops; 87 extern const struct uvm_pagerops uvm_deviceops; 88 extern const struct uvm_pagerops pmap_pager; 89 extern const struct uvm_pagerops bufcache_pager; 90 91 /* For object trees */ 92 int uvm_pagecmp(const struct vm_page *, const struct vm_page *); 93 RBT_PROTOTYPE(uvm_objtree, vm_page, objt, uvm_pagecmp) 94 95 #define UVM_OBJ_IS_VNODE(uobj) \ 96 ((uobj)->pgops == &uvm_vnodeops) 97 98 #define UVM_OBJ_IS_DEVICE(uobj) \ 99 ((uobj)->pgops == &uvm_deviceops) 100 101 #define UVM_OBJ_IS_VTEXT(uobj) \ 102 ((uobj)->pgops == &uvm_vnodeops && \ 103 ((struct vnode *)uobj)->v_flag & VTEXT) 104 105 #define UVM_OBJ_IS_AOBJ(uobj) \ 106 ((uobj)->pgops == &aobj_pager) 107 108 #define UVM_OBJ_IS_PMAP(uobj) \ 109 ((uobj)->pgops == &pmap_pager) 110 111 #define UVM_OBJ_IS_BUFCACHE(uobj) \ 112 ((uobj)->pgops == &bufcache_pager) 113 114 #define UVM_OBJ_IS_DUMMY(uobj) \ 115 (UVM_OBJ_IS_PMAP(uobj) || UVM_OBJ_IS_BUFCACHE(uobj)) 116 117 void uvm_obj_init(struct uvm_object *, const struct uvm_pagerops *, int); 118 void uvm_obj_destroy(struct uvm_object *); 119 void uvm_obj_setlock(struct uvm_object *, struct rwlock *); 120 int uvm_obj_wire(struct uvm_object *, voff_t, voff_t, struct pglist *); 121 void uvm_obj_unwire(struct uvm_object *, voff_t, voff_t); 122 void uvm_obj_free(struct uvm_object *); 123 124 #endif /* _KERNEL */ 125 126 #endif /* _UVM_UVM_OBJECT_H_ */ 127