1 1.78 riastrad /* $NetBSD: uvm.h,v 1.78 2023/07/17 12:55:37 riastradh Exp $ */ 2 1.3 mrg 3 1.1 mrg /* 4 1.1 mrg * Copyright (c) 1997 Charles D. Cranor and Washington University. 5 1.1 mrg * All rights reserved. 6 1.1 mrg * 7 1.1 mrg * Redistribution and use in source and binary forms, with or without 8 1.1 mrg * modification, are permitted provided that the following conditions 9 1.1 mrg * are met: 10 1.1 mrg * 1. Redistributions of source code must retain the above copyright 11 1.1 mrg * notice, this list of conditions and the following disclaimer. 12 1.1 mrg * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 mrg * notice, this list of conditions and the following disclaimer in the 14 1.1 mrg * documentation and/or other materials provided with the distribution. 15 1.1 mrg * 16 1.1 mrg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 1.1 mrg * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 1.1 mrg * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 1.1 mrg * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 1.1 mrg * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21 1.1 mrg * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 1.1 mrg * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 1.1 mrg * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 1.1 mrg * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 1.1 mrg * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 1.3 mrg * 27 1.3 mrg * from: Id: uvm.h,v 1.1.2.14 1998/02/02 20:07:19 chuck Exp 28 1.1 mrg */ 29 1.1 mrg 30 1.4 perry #ifndef _UVM_UVM_H_ 31 1.4 perry #define _UVM_UVM_H_ 32 1.4 perry 33 1.28 mrg #if defined(_KERNEL_OPT) 34 1.8 thorpej #include "opt_lockdebug.h" 35 1.12 thorpej #include "opt_multiprocessor.h" 36 1.5 mrg #include "opt_uvmhist.h" 37 1.59 uebayasi #include "opt_uvm_page_trkown.h" 38 1.9 pk #endif 39 1.5 mrg 40 1.1 mrg #include <uvm/uvm_extern.h> 41 1.1 mrg 42 1.62 mrg #ifdef _KERNEL 43 1.1 mrg #include <uvm/uvm_stat.h> 44 1.62 mrg #endif 45 1.1 mrg 46 1.1 mrg /* 47 1.1 mrg * pull in prototypes 48 1.1 mrg */ 49 1.1 mrg 50 1.1 mrg #include <uvm/uvm_amap.h> 51 1.1 mrg #include <uvm/uvm_aobj.h> 52 1.1 mrg #include <uvm/uvm_fault.h> 53 1.1 mrg #include <uvm/uvm_glue.h> 54 1.1 mrg #include <uvm/uvm_km.h> 55 1.1 mrg #include <uvm/uvm_loan.h> 56 1.1 mrg #include <uvm/uvm_map.h> 57 1.1 mrg #include <uvm/uvm_object.h> 58 1.1 mrg #include <uvm/uvm_page.h> 59 1.1 mrg #include <uvm/uvm_pager.h> 60 1.1 mrg #include <uvm/uvm_pdaemon.h> 61 1.1 mrg #include <uvm/uvm_swap.h> 62 1.1 mrg 63 1.32 thorpej #ifdef _KERNEL 64 1.32 thorpej 65 1.68 cherry #include <uvm/uvm_physseg.h> 66 1.66 riastrad 67 1.1 mrg /* 68 1.10 thorpej * pull in VM_NFREELIST 69 1.10 thorpej */ 70 1.10 thorpej #include <machine/vmparam.h> 71 1.10 thorpej 72 1.45 yamt struct workqueue; 73 1.71 ad struct pgflcache; 74 1.45 yamt 75 1.10 thorpej /* 76 1.54 ad * per-cpu data 77 1.54 ad */ 78 1.54 ad 79 1.54 ad struct uvm_cpu { 80 1.72 ad /* allocator */ 81 1.71 ad struct pgflcache *pgflcache[VM_NFREELIST];/* cpu-local cached pages */ 82 1.71 ad void *pgflcachemem; /* pointer to allocated mem */ 83 1.71 ad size_t pgflcachememsz; /* size of allocated memory */ 84 1.71 ad u_int pgflcolor; /* next color to allocate */ 85 1.71 ad u_int pgflbucket; /* where to send our pages */ 86 1.72 ad 87 1.73 ad /* uvmpdpol: queue of intended page status changes. */ 88 1.73 ad struct vm_page **pdq; /* queue entries */ 89 1.73 ad u_int pdqhead; /* current queue head */ 90 1.73 ad u_int pdqtail; /* maximum number entries */ 91 1.73 ad int pdqtime; /* last time queue cleared */ 92 1.54 ad }; 93 1.54 ad 94 1.54 ad /* 95 1.1 mrg * uvm structure (vm global state: collected in one structure for ease 96 1.1 mrg * of reference...) 97 1.1 mrg */ 98 1.1 mrg 99 1.1 mrg struct uvm { 100 1.1 mrg /* vm_page related parameters */ 101 1.24 chs 102 1.1 mrg /* vm_page queues */ 103 1.21 thorpej struct pgfreelist page_free[VM_NFREELIST]; /* unallocated pages */ 104 1.71 ad u_int bucketcount; 105 1.71 ad bool page_init_done; /* true if uvm_page_init() finished */ 106 1.24 chs 107 1.1 mrg /* page daemon trigger */ 108 1.1 mrg int pagedaemon; /* daemon sleeps on this */ 109 1.52 ad struct lwp *pagedaemon_lwp; /* daemon's lid */ 110 1.52 ad }; 111 1.1 mrg 112 1.52 ad /* 113 1.52 ad * kernel object: to support anonymous pageable kernel memory 114 1.52 ad */ 115 1.52 ad extern struct uvm_object *uvm_kernel_object; 116 1.32 thorpej 117 1.51 ad /* 118 1.51 ad * locks (made globals for lockstat). 119 1.51 ad */ 120 1.51 ad 121 1.52 ad extern kmutex_t uvm_kentry_lock; 122 1.51 ad 123 1.32 thorpej #endif /* _KERNEL */ 124 1.1 mrg 125 1.1 mrg /* 126 1.1 mrg * vm_map_entry etype bits: 127 1.1 mrg */ 128 1.1 mrg 129 1.1 mrg #define UVM_ET_OBJ 0x01 /* it is a uvm_object */ 130 1.13 chuck #define UVM_ET_SUBMAP 0x02 /* it is a vm_map submap */ 131 1.13 chuck #define UVM_ET_COPYONWRITE 0x04 /* copy_on_write */ 132 1.13 chuck #define UVM_ET_NEEDSCOPY 0x08 /* needs_copy */ 133 1.1 mrg 134 1.1 mrg #define UVM_ET_ISOBJ(E) (((E)->etype & UVM_ET_OBJ) != 0) 135 1.1 mrg #define UVM_ET_ISSUBMAP(E) (((E)->etype & UVM_ET_SUBMAP) != 0) 136 1.1 mrg #define UVM_ET_ISCOPYONWRITE(E) (((E)->etype & UVM_ET_COPYONWRITE) != 0) 137 1.1 mrg #define UVM_ET_ISNEEDSCOPY(E) (((E)->etype & UVM_ET_NEEDSCOPY) != 0) 138 1.1 mrg 139 1.23 mrg #ifdef _KERNEL 140 1.23 mrg 141 1.1 mrg /* 142 1.23 mrg * holds all the internal UVM data 143 1.1 mrg */ 144 1.20 chs extern struct uvm uvm; 145 1.20 chs 146 1.20 chs /* 147 1.20 chs * historys 148 1.20 chs */ 149 1.20 chs 150 1.34 perry #ifdef UVMHIST 151 1.20 chs UVMHIST_DECL(maphist); 152 1.20 chs UVMHIST_DECL(pdhist); 153 1.24 chs UVMHIST_DECL(ubchist); 154 1.38 yamt UVMHIST_DECL(loanhist); 155 1.33 perry #endif 156 1.16 thorpej 157 1.42 yamt extern struct evcnt uvm_ra_total; 158 1.42 yamt extern struct evcnt uvm_ra_hit; 159 1.42 yamt extern struct evcnt uvm_ra_miss; 160 1.42 yamt 161 1.1 mrg /* 162 1.22 thorpej * UVM_UNLOCK_AND_WAIT: atomic unlock+wait... wrapper around the 163 1.22 thorpej * interlocked tsleep() function. 164 1.1 mrg */ 165 1.1 mrg 166 1.22 thorpej #define UVM_UNLOCK_AND_WAIT(event, slock, intr, msg, timo) \ 167 1.22 thorpej do { \ 168 1.53 ad (void) mtsleep(event, PVM | PNORELOCK | (intr ? PCATCH : 0), \ 169 1.22 thorpej msg, timo, slock); \ 170 1.33 perry } while (/*CONSTCOND*/ 0) 171 1.30 thorpej 172 1.44 yamt void uvm_kick_pdaemon(void); 173 1.1 mrg 174 1.1 mrg /* 175 1.1 mrg * UVM_PAGE_OWN: track page ownership (only if UVM_PAGE_TRKOWN) 176 1.1 mrg */ 177 1.1 mrg 178 1.1 mrg #if defined(UVM_PAGE_TRKOWN) 179 1.1 mrg #define UVM_PAGE_OWN(PG, TAG) uvm_page_own(PG, TAG) 180 1.16 thorpej #else 181 1.1 mrg #define UVM_PAGE_OWN(PG, TAG) /* nothing */ 182 1.1 mrg #endif /* UVM_PAGE_TRKOWN */ 183 1.1 mrg 184 1.1 mrg #include <uvm/uvm_fault_i.h> 185 1.41 yamt 186 1.16 thorpej #endif /* _KERNEL */ 187 1.4 perry 188 1.43 yamt #endif /* _UVM_UVM_H_ */ 189