root / lab4 / .minix-src / include / uvm / uvm.h @ 14
History | View | Annotate | Download (5.07 KB)
1 | 13 | up20180614 | /* $NetBSD: uvm.h,v 1.66 2015/04/13 22:04:44 riastradh Exp $ */
|
---|---|---|---|
2 | |||
3 | /*
|
||
4 | * Copyright (c) 1997 Charles D. Cranor and Washington University.
|
||
5 | * All rights reserved.
|
||
6 | *
|
||
7 | * Redistribution and use in source and binary forms, with or without
|
||
8 | * modification, are permitted provided that the following conditions
|
||
9 | * are met:
|
||
10 | * 1. Redistributions of source code must retain the above copyright
|
||
11 | * notice, this list of conditions and the following disclaimer.
|
||
12 | * 2. Redistributions in binary form must reproduce the above copyright
|
||
13 | * notice, this list of conditions and the following disclaimer in the
|
||
14 | * documentation and/or other materials provided with the distribution.
|
||
15 | *
|
||
16 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||
17 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||
18 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||
19 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||
20 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||
21 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||
22 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||
23 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||
25 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
26 | *
|
||
27 | * from: Id: uvm.h,v 1.1.2.14 1998/02/02 20:07:19 chuck Exp
|
||
28 | */
|
||
29 | |||
30 | #ifndef _UVM_UVM_H_
|
||
31 | #define _UVM_UVM_H_
|
||
32 | |||
33 | #if defined(_KERNEL_OPT)
|
||
34 | #include "opt_lockdebug.h" |
||
35 | #include "opt_multiprocessor.h" |
||
36 | #include "opt_uvmhist.h" |
||
37 | #include "opt_uvm_page_trkown.h" |
||
38 | #endif
|
||
39 | |||
40 | #include <uvm/uvm_extern.h> |
||
41 | |||
42 | #ifdef _KERNEL
|
||
43 | #include <uvm/uvm_stat.h> |
||
44 | #endif
|
||
45 | |||
46 | /*
|
||
47 | * pull in prototypes
|
||
48 | */
|
||
49 | |||
50 | #include <uvm/uvm_amap.h> |
||
51 | #include <uvm/uvm_aobj.h> |
||
52 | #include <uvm/uvm_fault.h> |
||
53 | #include <uvm/uvm_glue.h> |
||
54 | #include <uvm/uvm_km.h> |
||
55 | #include <uvm/uvm_loan.h> |
||
56 | #include <uvm/uvm_map.h> |
||
57 | #include <uvm/uvm_object.h> |
||
58 | #include <uvm/uvm_page.h> |
||
59 | #include <uvm/uvm_pager.h> |
||
60 | #include <uvm/uvm_pdaemon.h> |
||
61 | #include <uvm/uvm_swap.h> |
||
62 | |||
63 | #ifdef _KERNEL
|
||
64 | |||
65 | #include <sys/rndsource.h> |
||
66 | |||
67 | /*
|
||
68 | * pull in VM_NFREELIST
|
||
69 | */
|
||
70 | #include <machine/vmparam.h> |
||
71 | |||
72 | struct workqueue;
|
||
73 | |||
74 | /*
|
||
75 | * per-cpu data
|
||
76 | */
|
||
77 | |||
78 | struct uvm_cpu {
|
||
79 | struct pgfreelist page_free[VM_NFREELIST]; /* unallocated pages */ |
||
80 | int page_free_nextcolor; /* next color to allocate from */ |
||
81 | int page_idlezero_next; /* which color to zero next */ |
||
82 | bool page_idle_zero; /* TRUE if we should try to zero |
||
83 | pages in the idle loop */
|
||
84 | int pages[PGFL_NQUEUES]; /* total of pages in page_free */ |
||
85 | u_int emap_gen; /* emap generation number */
|
||
86 | |||
87 | krndsource_t rs; /* entropy source */
|
||
88 | }; |
||
89 | |||
90 | /*
|
||
91 | * uvm structure (vm global state: collected in one structure for ease
|
||
92 | * of reference...)
|
||
93 | */
|
||
94 | |||
95 | struct uvm {
|
||
96 | /* vm_page related parameters */
|
||
97 | |||
98 | /* vm_page queues */
|
||
99 | struct pgfreelist page_free[VM_NFREELIST]; /* unallocated pages */ |
||
100 | bool page_init_done; /* TRUE if uvm_page_init() finished */ |
||
101 | |||
102 | /* page daemon trigger */
|
||
103 | int pagedaemon; /* daemon sleeps on this */ |
||
104 | struct lwp *pagedaemon_lwp; /* daemon's lid */ |
||
105 | |||
106 | /* aiodone daemon */
|
||
107 | struct workqueue *aiodone_queue;
|
||
108 | |||
109 | /* aio_done is locked by uvm.pagedaemon_lock and splbio! */
|
||
110 | TAILQ_HEAD(, buf) aio_done; /* done async i/o reqs */
|
||
111 | |||
112 | /* per-cpu data */
|
||
113 | struct uvm_cpu *cpus[MAXCPUS];
|
||
114 | }; |
||
115 | |||
116 | /*
|
||
117 | * kernel object: to support anonymous pageable kernel memory
|
||
118 | */
|
||
119 | extern struct uvm_object *uvm_kernel_object; |
||
120 | |||
121 | /*
|
||
122 | * locks (made globals for lockstat).
|
||
123 | */
|
||
124 | |||
125 | extern kmutex_t uvm_pageqlock; /* lock for active/inactive page q */ |
||
126 | extern kmutex_t uvm_fpageqlock; /* lock for free page q */ |
||
127 | extern kmutex_t uvm_kentry_lock;
|
||
128 | extern kmutex_t uvm_swap_data_lock;
|
||
129 | |||
130 | #endif /* _KERNEL */ |
||
131 | |||
132 | /*
|
||
133 | * vm_map_entry etype bits:
|
||
134 | */
|
||
135 | |||
136 | #define UVM_ET_OBJ 0x01 /* it is a uvm_object */ |
||
137 | #define UVM_ET_SUBMAP 0x02 /* it is a vm_map submap */ |
||
138 | #define UVM_ET_COPYONWRITE 0x04 /* copy_on_write */ |
||
139 | #define UVM_ET_NEEDSCOPY 0x08 /* needs_copy */ |
||
140 | |||
141 | #define UVM_ET_ISOBJ(E) (((E)->etype & UVM_ET_OBJ) != 0) |
||
142 | #define UVM_ET_ISSUBMAP(E) (((E)->etype & UVM_ET_SUBMAP) != 0) |
||
143 | #define UVM_ET_ISCOPYONWRITE(E) (((E)->etype & UVM_ET_COPYONWRITE) != 0) |
||
144 | #define UVM_ET_ISNEEDSCOPY(E) (((E)->etype & UVM_ET_NEEDSCOPY) != 0) |
||
145 | |||
146 | #ifdef _KERNEL
|
||
147 | |||
148 | /*
|
||
149 | * holds all the internal UVM data
|
||
150 | */
|
||
151 | extern struct uvm uvm; |
||
152 | |||
153 | /*
|
||
154 | * historys
|
||
155 | */
|
||
156 | |||
157 | #ifdef UVMHIST
|
||
158 | UVMHIST_DECL(maphist); |
||
159 | UVMHIST_DECL(pdhist); |
||
160 | UVMHIST_DECL(ubchist); |
||
161 | UVMHIST_DECL(loanhist); |
||
162 | #endif
|
||
163 | |||
164 | extern struct evcnt uvm_ra_total; |
||
165 | extern struct evcnt uvm_ra_hit; |
||
166 | extern struct evcnt uvm_ra_miss; |
||
167 | |||
168 | /*
|
||
169 | * UVM_UNLOCK_AND_WAIT: atomic unlock+wait... wrapper around the
|
||
170 | * interlocked tsleep() function.
|
||
171 | */
|
||
172 | |||
173 | #define UVM_UNLOCK_AND_WAIT(event, slock, intr, msg, timo) \
|
||
174 | do { \
|
||
175 | (void) mtsleep(event, PVM | PNORELOCK | (intr ? PCATCH : 0), \ |
||
176 | msg, timo, slock); \ |
||
177 | } while (/*CONSTCOND*/ 0) |
||
178 | |||
179 | void uvm_kick_pdaemon(void); |
||
180 | |||
181 | /*
|
||
182 | * UVM_PAGE_OWN: track page ownership (only if UVM_PAGE_TRKOWN)
|
||
183 | */
|
||
184 | |||
185 | #if defined(UVM_PAGE_TRKOWN)
|
||
186 | #define UVM_PAGE_OWN(PG, TAG) uvm_page_own(PG, TAG)
|
||
187 | #else
|
||
188 | #define UVM_PAGE_OWN(PG, TAG) /* nothing */ |
||
189 | #endif /* UVM_PAGE_TRKOWN */ |
||
190 | |||
191 | #include <uvm/uvm_fault_i.h> |
||
192 | |||
193 | #endif /* _KERNEL */ |
||
194 | |||
195 | #endif /* _UVM_UVM_H_ */ |