[BACK]Return to uvm.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / uvm

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>