Annotation of src/sys/uvm/uvm.h, Revision 1.59.4.1
1.59.4.1! bouyer 1: /* $NetBSD: uvm.h,v 1.61 2011/02/02 17:53:42 chuck Exp $ */
1.58 ad 2:
3: /*
1.1 mrg 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.
1.3 mrg 26: *
27: * from: Id: uvm.h,v 1.1.2.14 1998/02/02 20:07:19 chuck Exp
1.1 mrg 28: */
29:
1.4 perry 30: #ifndef _UVM_UVM_H_
31: #define _UVM_UVM_H_
32:
1.28 mrg 33: #if defined(_KERNEL_OPT)
1.8 thorpej 34: #include "opt_lockdebug.h"
1.12 thorpej 35: #include "opt_multiprocessor.h"
1.5 mrg 36: #include "opt_uvmhist.h"
1.59 uebayasi 37: #include "opt_uvm_page_trkown.h"
1.9 pk 38: #endif
1.5 mrg 39:
1.1 mrg 40: #include <uvm/uvm_extern.h>
41:
42: #include <uvm/uvm_stat.h>
43:
44: /*
45: * pull in prototypes
46: */
47:
48: #include <uvm/uvm_amap.h>
49: #include <uvm/uvm_aobj.h>
50: #include <uvm/uvm_fault.h>
51: #include <uvm/uvm_glue.h>
52: #include <uvm/uvm_km.h>
53: #include <uvm/uvm_loan.h>
54: #include <uvm/uvm_map.h>
55: #include <uvm/uvm_object.h>
56: #include <uvm/uvm_page.h>
57: #include <uvm/uvm_pager.h>
58: #include <uvm/uvm_pdaemon.h>
59: #include <uvm/uvm_swap.h>
60:
1.32 thorpej 61: #ifdef _KERNEL
62:
1.1 mrg 63: /*
1.10 thorpej 64: * pull in VM_NFREELIST
65: */
66: #include <machine/vmparam.h>
67:
1.45 yamt 68: struct workqueue;
69:
1.10 thorpej 70: /*
1.54 ad 71: * per-cpu data
72: */
73:
74: struct uvm_cpu {
75: struct pgfreelist page_free[VM_NFREELIST]; /* unallocated pages */
76: int page_free_nextcolor; /* next color to allocate from */
77: int page_idlezero_next; /* which color to zero next */
78: bool page_idle_zero; /* TRUE if we should try to zero
79: pages in the idle loop */
80: int pages[PGFL_NQUEUES]; /* total of pages in page_free */
1.56 rmind 81: u_int emap_gen; /* emap generation number */
1.54 ad 82: };
83:
84: /*
1.1 mrg 85: * uvm structure (vm global state: collected in one structure for ease
86: * of reference...)
87: */
88:
89: struct uvm {
90: /* vm_page related parameters */
1.24 chs 91:
1.1 mrg 92: /* vm_page queues */
1.21 thorpej 93: struct pgfreelist page_free[VM_NFREELIST]; /* unallocated pages */
1.48 thorpej 94: bool page_init_done; /* TRUE if uvm_page_init() finished */
1.24 chs 95:
1.1 mrg 96: /* page daemon trigger */
97: int pagedaemon; /* daemon sleeps on this */
1.52 ad 98: struct lwp *pagedaemon_lwp; /* daemon's lid */
1.24 chs 99:
1.45 yamt 100: /* aiodone daemon */
101: struct workqueue *aiodone_queue;
1.24 chs 102:
1.1 mrg 103: /* aio_done is locked by uvm.pagedaemon_lock and splbio! */
1.24 chs 104: TAILQ_HEAD(, buf) aio_done; /* done async i/o reqs */
1.15 chs 105:
1.54 ad 106: /* per-cpu data */
1.58 ad 107: struct uvm_cpu *cpus[MAXCPUS];
1.52 ad 108: };
1.1 mrg 109:
1.52 ad 110: /*
111: * kernel object: to support anonymous pageable kernel memory
112: */
113: extern struct uvm_object *uvm_kernel_object;
1.32 thorpej 114:
1.51 ad 115: /*
116: * locks (made globals for lockstat).
117: */
118:
1.53 ad 119: extern kmutex_t uvm_pageqlock; /* lock for active/inactive page q */
1.52 ad 120: extern kmutex_t uvm_fpageqlock; /* lock for free page q */
121: extern kmutex_t uvm_kentry_lock;
122: extern kmutex_t uvm_swap_data_lock;
1.51 ad 123:
1.32 thorpej 124: #endif /* _KERNEL */
1.1 mrg 125:
126: /*
127: * vm_map_entry etype bits:
128: */
129:
130: #define UVM_ET_OBJ 0x01 /* it is a uvm_object */
1.13 chuck 131: #define UVM_ET_SUBMAP 0x02 /* it is a vm_map submap */
132: #define UVM_ET_COPYONWRITE 0x04 /* copy_on_write */
133: #define UVM_ET_NEEDSCOPY 0x08 /* needs_copy */
1.1 mrg 134:
135: #define UVM_ET_ISOBJ(E) (((E)->etype & UVM_ET_OBJ) != 0)
136: #define UVM_ET_ISSUBMAP(E) (((E)->etype & UVM_ET_SUBMAP) != 0)
137: #define UVM_ET_ISCOPYONWRITE(E) (((E)->etype & UVM_ET_COPYONWRITE) != 0)
138: #define UVM_ET_ISNEEDSCOPY(E) (((E)->etype & UVM_ET_NEEDSCOPY) != 0)
139:
1.23 mrg 140: #ifdef _KERNEL
141:
1.1 mrg 142: /*
1.23 mrg 143: * holds all the internal UVM data
1.1 mrg 144: */
1.20 chs 145: extern struct uvm uvm;
146:
147: /*
148: * historys
149: */
150:
1.34 perry 151: #ifdef UVMHIST
1.20 chs 152: UVMHIST_DECL(maphist);
153: UVMHIST_DECL(pdhist);
1.24 chs 154: UVMHIST_DECL(ubchist);
1.38 yamt 155: UVMHIST_DECL(loanhist);
1.33 perry 156: #endif
1.16 thorpej 157:
1.42 yamt 158: extern struct evcnt uvm_ra_total;
159: extern struct evcnt uvm_ra_hit;
160: extern struct evcnt uvm_ra_miss;
161:
1.1 mrg 162: /*
1.22 thorpej 163: * UVM_UNLOCK_AND_WAIT: atomic unlock+wait... wrapper around the
164: * interlocked tsleep() function.
1.1 mrg 165: */
166:
1.22 thorpej 167: #define UVM_UNLOCK_AND_WAIT(event, slock, intr, msg, timo) \
168: do { \
1.53 ad 169: (void) mtsleep(event, PVM | PNORELOCK | (intr ? PCATCH : 0), \
1.22 thorpej 170: msg, timo, slock); \
1.33 perry 171: } while (/*CONSTCOND*/ 0)
1.30 thorpej 172:
1.44 yamt 173: void uvm_kick_pdaemon(void);
1.1 mrg 174:
175: /*
176: * UVM_PAGE_OWN: track page ownership (only if UVM_PAGE_TRKOWN)
177: */
178:
179: #if defined(UVM_PAGE_TRKOWN)
180: #define UVM_PAGE_OWN(PG, TAG) uvm_page_own(PG, TAG)
1.16 thorpej 181: #else
1.1 mrg 182: #define UVM_PAGE_OWN(PG, TAG) /* nothing */
183: #endif /* UVM_PAGE_TRKOWN */
184:
185: #include <uvm/uvm_fault_i.h>
1.41 yamt 186:
1.16 thorpej 187: #endif /* _KERNEL */
1.4 perry 188:
1.43 yamt 189: #endif /* _UVM_UVM_H_ */
CVSweb <webmaster@jp.NetBSD.org>