Annotation of src/sys/uvm/uvm.h, Revision 1.30.2.2
1.30.2.2! jdolecek 1: /* $NetBSD: uvm.h,v 1.30.2.1 2002/01/10 20:05:27 thorpej Exp $ */
1.3 mrg 2:
1.1 mrg 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: * 3. All advertising materials mentioning features or use of this software
17: * must display the following acknowledgement:
18: * This product includes software developed by Charles D. Cranor and
19: * Washington University.
20: * 4. The name of the author may not be used to endorse or promote products
21: * derived from this software without specific prior written permission.
22: *
23: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1.3 mrg 33: *
34: * from: Id: uvm.h,v 1.1.2.14 1998/02/02 20:07:19 chuck Exp
1.1 mrg 35: */
36:
1.4 perry 37: #ifndef _UVM_UVM_H_
38: #define _UVM_UVM_H_
39:
1.28 mrg 40: #if defined(_KERNEL_OPT)
1.8 thorpej 41: #include "opt_lockdebug.h"
1.12 thorpej 42: #include "opt_multiprocessor.h"
1.5 mrg 43: #include "opt_uvmhist.h"
1.9 pk 44: #endif
1.5 mrg 45:
1.1 mrg 46: #include <uvm/uvm_extern.h>
47:
48: #include <uvm/uvm_stat.h>
49:
50: /*
51: * pull in prototypes
52: */
53:
54: #include <uvm/uvm_amap.h>
55: #include <uvm/uvm_aobj.h>
56: #include <uvm/uvm_fault.h>
57: #include <uvm/uvm_glue.h>
58: #include <uvm/uvm_km.h>
59: #include <uvm/uvm_loan.h>
60: #include <uvm/uvm_map.h>
61: #include <uvm/uvm_object.h>
62: #include <uvm/uvm_page.h>
63: #include <uvm/uvm_pager.h>
64: #include <uvm/uvm_pdaemon.h>
65: #include <uvm/uvm_swap.h>
66:
1.30.2.2! jdolecek 67: #ifdef _KERNEL
! 68:
1.1 mrg 69: /*
1.10 thorpej 70: * pull in VM_NFREELIST
71: */
72: #include <machine/vmparam.h>
73:
74: /*
1.1 mrg 75: * uvm structure (vm global state: collected in one structure for ease
76: * of reference...)
77: */
78:
79: struct uvm {
80: /* vm_page related parameters */
1.24 chs 81:
1.1 mrg 82: /* vm_page queues */
1.21 thorpej 83: struct pgfreelist page_free[VM_NFREELIST]; /* unallocated pages */
1.25 thorpej 84: int page_free_nextcolor; /* next color to allocate from */
1.1 mrg 85: struct pglist page_active; /* allocated pages, in use */
1.26 ross 86: struct pglist page_inactive; /* pages between the clock hands */
1.27 chs 87: struct simplelock pageqlock; /* lock for active/inactive page q */
88: struct simplelock fpageqlock; /* lock for free page q */
1.19 thorpej 89: boolean_t page_init_done; /* TRUE if uvm_page_init() finished */
1.21 thorpej 90: boolean_t page_idle_zero; /* TRUE if we should try to zero
91: pages in the idle loop */
1.24 chs 92:
1.1 mrg 93: /* page daemon trigger */
94: int pagedaemon; /* daemon sleeps on this */
95: struct proc *pagedaemon_proc; /* daemon's pid */
1.27 chs 96: struct simplelock pagedaemon_lock;
1.24 chs 97:
98: /* aiodone daemon trigger */
99: int aiodoned; /* daemon sleeps on this */
100: struct proc *aiodoned_proc; /* daemon's pid */
1.27 chs 101: struct simplelock aiodoned_lock;
1.24 chs 102:
1.1 mrg 103: /* page hash */
104: struct pglist *page_hash; /* page hash table (vp/off->page) */
105: int page_nhash; /* number of buckets */
106: int page_hashmask; /* hash mask */
1.27 chs 107: struct simplelock hashlock; /* lock on page_hash array */
1.15 chs 108:
1.1 mrg 109: /* anon stuff */
110: struct vm_anon *afree; /* anon free list */
1.27 chs 111: struct simplelock afreelock; /* lock on anon free list */
1.1 mrg 112:
113: /* static kernel map entry pool */
1.29 chs 114: struct vm_map_entry *kentry_free; /* free page pool */
1.27 chs 115: struct simplelock kentry_lock;
1.1 mrg 116:
117: /* aio_done is locked by uvm.pagedaemon_lock and splbio! */
1.24 chs 118: TAILQ_HEAD(, buf) aio_done; /* done async i/o reqs */
1.15 chs 119:
120: /* swap-related items */
1.27 chs 121: struct simplelock swap_data_lock;
1.1 mrg 122:
123: /* kernel object: to support anonymous pageable kernel memory */
124: struct uvm_object *kernel_object;
125: };
1.30.2.2! jdolecek 126:
! 127: #endif /* _KERNEL */
1.1 mrg 128:
129: /*
130: * vm_map_entry etype bits:
131: */
132:
133: #define UVM_ET_OBJ 0x01 /* it is a uvm_object */
1.13 chuck 134: #define UVM_ET_SUBMAP 0x02 /* it is a vm_map submap */
135: #define UVM_ET_COPYONWRITE 0x04 /* copy_on_write */
136: #define UVM_ET_NEEDSCOPY 0x08 /* needs_copy */
1.1 mrg 137:
138: #define UVM_ET_ISOBJ(E) (((E)->etype & UVM_ET_OBJ) != 0)
139: #define UVM_ET_ISSUBMAP(E) (((E)->etype & UVM_ET_SUBMAP) != 0)
140: #define UVM_ET_ISCOPYONWRITE(E) (((E)->etype & UVM_ET_COPYONWRITE) != 0)
141: #define UVM_ET_ISNEEDSCOPY(E) (((E)->etype & UVM_ET_NEEDSCOPY) != 0)
142:
1.23 mrg 143: #ifdef _KERNEL
144:
1.1 mrg 145: /*
1.23 mrg 146: * holds all the internal UVM data
1.1 mrg 147: */
1.20 chs 148: extern struct uvm uvm;
149:
150: /*
151: * historys
152: */
153:
154: UVMHIST_DECL(maphist);
155: UVMHIST_DECL(pdhist);
1.24 chs 156: UVMHIST_DECL(ubchist);
1.16 thorpej 157:
1.1 mrg 158: /*
1.22 thorpej 159: * UVM_UNLOCK_AND_WAIT: atomic unlock+wait... wrapper around the
160: * interlocked tsleep() function.
1.1 mrg 161: */
162:
1.22 thorpej 163: #define UVM_UNLOCK_AND_WAIT(event, slock, intr, msg, timo) \
164: do { \
165: (void) ltsleep(event, PVM | PNORELOCK | (intr ? PCATCH : 0), \
166: msg, timo, slock); \
167: } while (0)
1.30 thorpej 168:
169: /*
170: * UVM_KICK_PDAEMON: perform checks to determine if we need to
171: * give the pagedaemon a nudge, and do so if necessary.
172: */
173:
174: #define UVM_KICK_PDAEMON() \
175: do { \
176: if (uvmexp.free + uvmexp.paging < uvmexp.freemin || \
177: (uvmexp.free + uvmexp.paging < uvmexp.freetarg && \
178: uvmexp.inactive < uvmexp.inactarg)) { \
179: wakeup(&uvm.pagedaemon); \
180: } \
181: } while (/*CONSTCOND*/0)
1.1 mrg 182:
183: /*
184: * UVM_PAGE_OWN: track page ownership (only if UVM_PAGE_TRKOWN)
185: */
186:
187: #if defined(UVM_PAGE_TRKOWN)
188: #define UVM_PAGE_OWN(PG, TAG) uvm_page_own(PG, TAG)
1.16 thorpej 189: #else
1.1 mrg 190: #define UVM_PAGE_OWN(PG, TAG) /* nothing */
191: #endif /* UVM_PAGE_TRKOWN */
192:
193: /*
194: * pull in inlines
195: */
196:
197: #include <uvm/uvm_amap_i.h>
198: #include <uvm/uvm_fault_i.h>
199: #include <uvm/uvm_map_i.h>
200: #include <uvm/uvm_page_i.h>
201: #include <uvm/uvm_pager_i.h>
1.16 thorpej 202:
203: #endif /* _KERNEL */
1.4 perry 204:
205: #endif /* _UVM_UVM_H_ */
CVSweb <webmaster@jp.NetBSD.org>