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

Annotation of src/sys/uvm/uvm_extern.h, Revision 1.139

1.139   ! yamt        1: /*     $NetBSD: uvm_extern.h,v 1.138 2007/12/05 09:35:46 yamt Exp $    */
1.1       mrg         2:
                      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.4       mrg        33:  *
                     34:  * from: Id: uvm_extern.h,v 1.1.2.21 1998/02/07 01:16:53 chs Exp
1.1       mrg        35:  */
                     36:
1.44      mrg        37: /*-
1.45      mrg        38:  * Copyright (c) 1991, 1992, 1993
1.44      mrg        39:  *     The Regents of the University of California.  All rights reserved.
                     40:  *
                     41:  * Redistribution and use in source and binary forms, with or without
                     42:  * modification, are permitted provided that the following conditions
                     43:  * are met:
                     44:  * 1. Redistributions of source code must retain the above copyright
                     45:  *    notice, this list of conditions and the following disclaimer.
                     46:  * 2. Redistributions in binary form must reproduce the above copyright
                     47:  *    notice, this list of conditions and the following disclaimer in the
                     48:  *    documentation and/or other materials provided with the distribution.
1.83      agc        49:  * 3. Neither the name of the University nor the names of its contributors
1.44      mrg        50:  *    may be used to endorse or promote products derived from this software
                     51:  *    without specific prior written permission.
                     52:  *
                     53:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     54:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     55:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     56:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     57:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     58:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     59:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     60:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     61:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     62:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     63:  * SUCH DAMAGE.
                     64:  *
                     65:  *     @(#)vm_extern.h 8.5 (Berkeley) 5/3/95
                     66:  */
                     67:
1.8       perry      68: #ifndef _UVM_UVM_EXTERN_H_
                     69: #define _UVM_UVM_EXTERN_H_
1.1       mrg        70:
                     71: /*
                     72:  * uvm_extern.h: this file defines the external interface to the VM system.
                     73:  *
                     74:  * this should be the only file included by non-VM parts of the kernel
                     75:  * which need access to VM services.   if you want to know the interface
                     76:  * to the MI VM layer without knowing the details, this is the file to
                     77:  * learn.
                     78:  *
                     79:  * NOTE: vm system calls are prototyped in syscallargs.h
                     80:  */
                     81:
                     82: /*
1.45      mrg        83:  * typedefs, necessary for standard UVM headers.
                     84:  */
                     85:
1.65      chs        86: typedef unsigned int uvm_flag_t;
1.45      mrg        87:
                     88: typedef int vm_inherit_t;      /* XXX: inheritance codes */
                     89: typedef off_t voff_t;          /* XXX: offset within a uvm_object */
1.117     cherry     90: typedef voff_t pgoff_t;                /* XXX: number of pages within a uvm object */
1.45      mrg        91:
                     92: /*
1.1       mrg        93:  * defines
                     94:  */
                     95:
                     96: /*
                     97:  * the following defines are for uvm_map and functions which call it.
                     98:  */
                     99:
                    100: /* protections bits */
                    101: #define UVM_PROT_MASK  0x07    /* protection mask */
                    102: #define UVM_PROT_NONE  0x00    /* protection none */
                    103: #define UVM_PROT_ALL   0x07    /* everything */
                    104: #define UVM_PROT_READ  0x01    /* read */
                    105: #define UVM_PROT_WRITE  0x02   /* write */
                    106: #define UVM_PROT_EXEC  0x04    /* exec */
                    107:
                    108: /* protection short codes */
                    109: #define UVM_PROT_R     0x01    /* read */
                    110: #define UVM_PROT_W     0x02    /* write */
                    111: #define UVM_PROT_RW    0x03    /* read-write */
                    112: #define UVM_PROT_X     0x04    /* exec */
                    113: #define UVM_PROT_RX    0x05    /* read-exec */
                    114: #define UVM_PROT_WX    0x06    /* write-exec */
                    115: #define UVM_PROT_RWX   0x07    /* read-write-exec */
                    116:
                    117: /* 0x08: not used */
                    118:
                    119: /* inherit codes */
                    120: #define UVM_INH_MASK   0x30    /* inherit mask */
                    121: #define UVM_INH_SHARE  0x00    /* "share" */
                    122: #define UVM_INH_COPY   0x10    /* "copy" */
                    123: #define UVM_INH_NONE   0x20    /* "none" */
                    124: #define UVM_INH_DONATE 0x30    /* "donate" << not used */
                    125:
                    126: /* 0x40, 0x80: not used */
                    127:
                    128: /* bits 0x700: max protection, 0x800: not used */
                    129:
                    130: /* bits 0x7000: advice, 0x8000: not used */
1.107     yamt      131: /* advice: matches MADV_* from sys/mman.h and POSIX_FADV_* from sys/fcntl.h */
1.1       mrg       132: #define UVM_ADV_NORMAL 0x0     /* 'normal' */
                    133: #define UVM_ADV_RANDOM 0x1     /* 'random' */
                    134: #define UVM_ADV_SEQUENTIAL 0x2 /* 'sequential' */
                    135: /* 0x3: will need, 0x4: dontneed */
                    136: #define UVM_ADV_MASK   0x7     /* mask */
                    137:
1.98      yamt      138: /* bits 0xffff0000: mapping flags */
1.1       mrg       139: #define UVM_FLAG_FIXED   0x010000 /* find space */
                    140: #define UVM_FLAG_OVERLAY 0x020000 /* establish overlay */
                    141: #define UVM_FLAG_NOMERGE 0x040000 /* don't merge map entries */
                    142: #define UVM_FLAG_COPYONW 0x080000 /* set copy_on_write flag */
                    143: #define UVM_FLAG_AMAPPAD 0x100000 /* for bss: pad amap to reduce malloc() */
                    144: #define UVM_FLAG_TRYLOCK 0x200000 /* fail if we can not lock map */
1.75      thorpej   145: #define UVM_FLAG_NOWAIT  0x400000 /* not allowed to sleep */
1.94      yamt      146: #define UVM_FLAG_QUANTUM 0x800000 /* entry never be splitted later */
1.98      yamt      147: #define UVM_FLAG_WAITVA  0x1000000 /* wait for va */
1.100     yamt      148: #define UVM_FLAG_VAONLY  0x2000000 /* unmap: no pages are mapped */
1.1       mrg       149:
                    150: /* macros to extract info */
                    151: #define UVM_PROTECTION(X)      ((X) & UVM_PROT_MASK)
                    152: #define UVM_INHERIT(X)         (((X) & UVM_INH_MASK) >> 4)
                    153: #define UVM_MAXPROTECTION(X)   (((X) >> 8) & UVM_PROT_MASK)
                    154: #define UVM_ADVICE(X)          (((X) >> 12) & UVM_ADV_MASK)
                    155:
                    156: #define UVM_MAPFLAG(PROT,MAXPROT,INH,ADVICE,FLAGS) \
1.114     yamt      157:        (((MAXPROT) << 8)|(PROT)|(INH)|((ADVICE) << 12)|(FLAGS))
1.1       mrg       158:
1.67      chs       159: /* magic offset value: offset not known(obj) or don't care(!obj) */
1.38      kleink    160: #define UVM_UNKNOWN_OFFSET ((voff_t) -1)
1.1       mrg       161:
                    162: /*
1.100     yamt      163:  * the following defines are for uvm_km_alloc/free's flags
1.1       mrg       164:  */
1.100     yamt      165: #define UVM_KMF_WIRED  0x1                     /* allocation type: wired */
                    166: #define UVM_KMF_PAGEABLE 0x2                   /* allocation type: pageable */
                    167: #define UVM_KMF_VAONLY 0x4                     /* allocation type: VA only */
                    168: #define        UVM_KMF_TYPEMASK (UVM_KMF_VAONLY | UVM_KMF_PAGEABLE | UVM_KMF_WIRED)
                    169: #define UVM_KMF_CANFAIL        0x8                     /* caller handles failure */
                    170: #define UVM_KMF_ZERO   0x10                    /* want zero filled memory */
1.115     drochner  171: #define UVM_KMF_EXEC   0x20                    /* need executable mapping */
1.1       mrg       172: #define UVM_KMF_TRYLOCK        UVM_FLAG_TRYLOCK        /* try locking only */
1.75      thorpej   173: #define UVM_KMF_NOWAIT UVM_FLAG_NOWAIT         /* not allowed to sleep */
1.100     yamt      174: #define UVM_KMF_WAITVA UVM_FLAG_WAITVA         /* sleep for va */
1.1       mrg       175:
                    176: /*
1.15      thorpej   177:  * the following defines the strategies for uvm_pagealloc_strat()
                    178:  */
                    179: #define        UVM_PGA_STRAT_NORMAL    0       /* high -> low free list walk */
                    180: #define        UVM_PGA_STRAT_ONLY      1       /* only specified free list */
                    181: #define        UVM_PGA_STRAT_FALLBACK  2       /* ONLY falls back on NORMAL */
                    182:
                    183: /*
1.24      chs       184:  * flags for uvm_pagealloc_strat()
                    185:  */
1.39      thorpej   186: #define UVM_PGA_USERESERVE     0x0001  /* ok to use reserve pages */
                    187: #define        UVM_PGA_ZERO            0x0002  /* returned page must be zero'd */
1.24      chs       188:
                    189: /*
1.97      chs       190:  * flags for ubc_alloc()
1.53      chs       191:  */
1.130     yamt      192: #define UBC_READ       0x001
                    193: #define UBC_WRITE      0x002
                    194: #define UBC_FAULTBUSY  0x004
1.53      chs       195:
                    196: /*
1.97      chs       197:  * flags for ubc_release()
                    198:  */
1.130     yamt      199: #define UBC_UNMAP      0x010
                    200:
                    201: /*
                    202:  * flags for ubc_uiomve()
                    203:  */
                    204: #define        UBC_PARTIALOK   0x100
1.97      chs       205:
                    206: /*
1.53      chs       207:  * flags for uvn_findpages().
                    208:  */
1.67      chs       209: #define UFP_ALL                0x00
                    210: #define UFP_NOWAIT     0x01
                    211: #define UFP_NOALLOC    0x02
                    212: #define UFP_NOCACHE    0x04
                    213: #define UFP_NORDONLY   0x08
                    214: #define UFP_DIRTYONLY  0x10
                    215: #define UFP_BACKWARD   0x20
1.53      chs       216:
                    217: /*
1.33      thorpej   218:  * lockflags that control the locking behavior of various functions.
                    219:  */
                    220: #define        UVM_LK_ENTER    0x00000001      /* map locked on entry */
                    221: #define        UVM_LK_EXIT     0x00000002      /* leave map locked on exit */
                    222:
                    223: /*
1.1       mrg       224:  * structures
                    225:  */
                    226:
1.97      chs       227: struct buf;
1.1       mrg       228: struct core;
1.97      chs       229: struct loadavg;
1.1       mrg       230: struct mount;
                    231: struct pglist;
                    232: struct proc;
                    233: struct uio;
                    234: struct uvm_object;
                    235: struct vm_anon;
                    236: struct vmspace;
1.10      thorpej   237: struct pmap;
1.1       mrg       238: struct vnode;
1.53      chs       239: struct pool;
1.34      thorpej   240: struct simplelock;
1.65      chs       241: struct vm_map_entry;
                    242: struct vm_map;
                    243: struct vm_page;
1.97      chs       244: struct vmtotal;
1.53      chs       245:
1.1       mrg       246: /*
1.108     yamt      247:  * uvm_pctparam: parameter to be shown as percentage to user.
                    248:  */
                    249:
                    250: #define        UVM_PCTPARAM_SHIFT      8
                    251: #define        UVM_PCTPARAM_SCALE      (1 << UVM_PCTPARAM_SHIFT)
                    252: #define        UVM_PCTPARAM_APPLY(pct, x) \
                    253:        (((x) * (pct)->pct_scaled) >> UVM_PCTPARAM_SHIFT)
                    254: struct uvm_pctparam {
1.118     yamt      255:        int pct_pct;    /* percent [0, 100] */ /* should be the first member */
1.108     yamt      256:        int pct_scaled;
1.118     yamt      257:        int (*pct_check)(struct uvm_pctparam *, int);
1.108     yamt      258: };
                    259:
                    260: /*
1.1       mrg       261:  * uvmexp: global data structures that are exported to parts of the kernel
                    262:  * other than the vm system.
                    263:  */
                    264:
                    265: struct uvmexp {
1.9       mrg       266:        /* vm_page constants */
1.1       mrg       267:        int pagesize;   /* size of a page (PAGE_SIZE): must be power of 2 */
                    268:        int pagemask;   /* page mask */
                    269:        int pageshift;  /* page shift */
                    270:
1.9       mrg       271:        /* vm_page counters */
1.1       mrg       272:        int npages;     /* number of pages we manage */
                    273:        int free;       /* number of free pages */
1.3       chs       274:        int paging;     /* number of pages in the process of being paged out */
1.1       mrg       275:        int wired;      /* number of wired pages */
1.57      chs       276:
1.63      chs       277:        /*
1.57      chs       278:         * Adding anything before this line will break binary compatibility
                    279:         * with top(1) on NetBSD 1.5.
1.54      simonb    280:         */
1.57      chs       281:
1.67      chs       282:        int ncolors;    /* number of page color buckets: must be p-o-2 */
                    283:        int colormask;  /* color bucket mask */
                    284:
1.55      simonb    285:        int zeropages;          /* number of zero'd pages */
1.3       chs       286:        int reserve_pagedaemon; /* number of pages reserved for pagedaemon */
1.55      simonb    287:        int reserve_kernel;     /* number of pages reserved for kernel */
1.137     ad        288:        unsigned anonpages;     /* number of pages used by anon mappings */
                    289:        unsigned filepages;     /* number of pages used by cached file data */
                    290:        unsigned execpages;     /* number of pages used by cached exec data */
1.1       mrg       291:
1.9       mrg       292:        /* pageout params */
                    293:        int freemin;    /* min number of free pages */
                    294:        int freetarg;   /* target number of free pages */
                    295:        int wiredmax;   /* max number of wired pages */
1.1       mrg       296:
1.9       mrg       297:        /* swap */
1.1       mrg       298:        int nswapdev;   /* number of configured swap devices in system */
                    299:        int swpages;    /* number of PAGE_SIZE'ed swap pages */
1.84      pk        300:        int swpgavail;  /* number of swap pages currently available */
1.3       chs       301:        int swpginuse;  /* number of swap pages in use */
1.23      chs       302:        int swpgonly;   /* number of swap pages in use, not also in RAM */
1.1       mrg       303:        int nswget;     /* number of times fault calls uvm_swap_get() */
                    304:
1.110     simonb    305:        /* stat counters.  XXX: should be 64-bit counters */
1.7       mrg       306:        int faults;             /* page fault count */
                    307:        int traps;              /* trap count */
                    308:        int intrs;              /* interrupt count */
                    309:        int swtch;              /* context switch count */
                    310:        int softs;              /* software interrupt count */
                    311:        int syscalls;           /* system calls */
                    312:        int pageins;            /* pagein operation count */
                    313:                                /* pageouts are in pdpageouts below */
                    314:        int swapins;            /* swapins */
                    315:        int swapouts;           /* swapouts */
                    316:        int pgswapin;           /* pages swapped in */
                    317:        int pgswapout;          /* pages swapped out */
                    318:        int forks;              /* forks */
1.1       mrg       319:        int forks_ppwait;       /* forks where parent waits */
                    320:        int forks_sharevm;      /* forks where vmspace is shared */
1.40      thorpej   321:        int pga_zerohit;        /* pagealloc where zero wanted and zero
                    322:                                   was available */
                    323:        int pga_zeromiss;       /* pagealloc where zero wanted and zero
                    324:                                   not available */
1.50      thorpej   325:        int zeroaborts;         /* number of times page zeroing was
                    326:                                   aborted */
1.60      thorpej   327:        int colorhit;           /* pagealloc where we got optimal color */
                    328:        int colormiss;          /* pagealloc where we didn't */
1.1       mrg       329:
1.110     simonb    330:        /* fault subcounters.  XXX: should be 64-bit counters */
1.1       mrg       331:        int fltnoram;   /* number of times fault was out of ram */
                    332:        int fltnoanon;  /* number of times fault was out of anons */
                    333:        int fltpgwait;  /* number of times fault had to wait on a page */
                    334:        int fltpgrele;  /* number of times fault found a released page */
                    335:        int fltrelck;   /* number of times fault relock called */
                    336:        int fltrelckok; /* number of times fault relock is a success */
                    337:        int fltanget;   /* number of times fault gets anon page */
                    338:        int fltanretry; /* number of times fault retrys an anon get */
                    339:        int fltamcopy;  /* number of times fault clears "needs copy" */
                    340:        int fltnamap;   /* number of times fault maps a neighbor anon page */
                    341:        int fltnomap;   /* number of times fault maps a neighbor obj page */
                    342:        int fltlget;    /* number of times fault does a locked pgo_get */
                    343:        int fltget;     /* number of times fault does an unlocked get */
                    344:        int flt_anon;   /* number of times fault anon (case 1a) */
                    345:        int flt_acow;   /* number of times fault anon cow (case 1b) */
                    346:        int flt_obj;    /* number of times fault is on object page (2a) */
                    347:        int flt_prcopy; /* number of times fault promotes with copy (2b) */
                    348:        int flt_przero; /* number of times fault promotes with zerofill (2b) */
                    349:
1.110     simonb    350:        /* daemon counters.  XXX: should be 64-bit counters */
1.1       mrg       351:        int pdwoke;     /* number of times daemon woke up */
                    352:        int pdrevs;     /* number of times daemon rev'd clock hand */
                    353:        int pdswout;    /* number of times daemon called for swapout */
                    354:        int pdfreed;    /* number of pages daemon freed since boot */
1.78      wiz       355:        int pdscans;    /* number of pages daemon scanned since boot */
1.1       mrg       356:        int pdanscan;   /* number of anonymous pages scanned by daemon */
                    357:        int pdobscan;   /* number of object pages scanned by daemon */
                    358:        int pdreact;    /* number of pages daemon reactivated since boot */
                    359:        int pdbusy;     /* number of times daemon found a busy page */
                    360:        int pdpageouts; /* number of times daemon started a pageout */
                    361:        int pdpending;  /* number of times daemon got a pending pagout */
                    362:        int pddeact;    /* number of pages daemon deactivates */
1.69      chs       363:        int pdreanon;   /* anon pages reactivated due to thresholds */
                    364:        int pdrefile;   /* file pages reactivated due to thresholds */
                    365:        int pdreexec;   /* executable pages reactivated due to thresholds */
1.54      simonb    366: };
                    367:
                    368: /*
                    369:  * The following structure is 64-bit alignment safe.  New elements
                    370:  * should only be added to the end of this structure so binary
                    371:  * compatibility can be preserved.
                    372:  */
                    373: struct uvmexp_sysctl {
                    374:        int64_t pagesize;
                    375:        int64_t pagemask;
                    376:        int64_t pageshift;
                    377:        int64_t npages;
                    378:        int64_t free;
                    379:        int64_t active;
                    380:        int64_t inactive;
                    381:        int64_t paging;
                    382:        int64_t wired;
                    383:        int64_t zeropages;
                    384:        int64_t reserve_pagedaemon;
                    385:        int64_t reserve_kernel;
                    386:        int64_t freemin;
                    387:        int64_t freetarg;
1.118     yamt      388:        int64_t inactarg; /* unused */
1.54      simonb    389:        int64_t wiredmax;
                    390:        int64_t nswapdev;
                    391:        int64_t swpages;
                    392:        int64_t swpginuse;
                    393:        int64_t swpgonly;
                    394:        int64_t nswget;
1.101     yamt      395:        int64_t unused1; /* used to be nanon */
                    396:        int64_t unused2; /* used to be nanonneeded */
                    397:        int64_t unused3; /* used to be nfreeanon */
1.54      simonb    398:        int64_t faults;
                    399:        int64_t traps;
                    400:        int64_t intrs;
                    401:        int64_t swtch;
                    402:        int64_t softs;
                    403:        int64_t syscalls;
                    404:        int64_t pageins;
                    405:        int64_t swapins;
                    406:        int64_t swapouts;
                    407:        int64_t pgswapin;
                    408:        int64_t pgswapout;
                    409:        int64_t forks;
                    410:        int64_t forks_ppwait;
                    411:        int64_t forks_sharevm;
                    412:        int64_t pga_zerohit;
                    413:        int64_t pga_zeromiss;
                    414:        int64_t zeroaborts;
                    415:        int64_t fltnoram;
                    416:        int64_t fltnoanon;
                    417:        int64_t fltpgwait;
                    418:        int64_t fltpgrele;
                    419:        int64_t fltrelck;
                    420:        int64_t fltrelckok;
                    421:        int64_t fltanget;
                    422:        int64_t fltanretry;
                    423:        int64_t fltamcopy;
                    424:        int64_t fltnamap;
                    425:        int64_t fltnomap;
                    426:        int64_t fltlget;
                    427:        int64_t fltget;
                    428:        int64_t flt_anon;
                    429:        int64_t flt_acow;
                    430:        int64_t flt_obj;
                    431:        int64_t flt_prcopy;
                    432:        int64_t flt_przero;
                    433:        int64_t pdwoke;
                    434:        int64_t pdrevs;
                    435:        int64_t pdswout;
                    436:        int64_t pdfreed;
                    437:        int64_t pdscans;
                    438:        int64_t pdanscan;
                    439:        int64_t pdobscan;
                    440:        int64_t pdreact;
                    441:        int64_t pdbusy;
                    442:        int64_t pdpageouts;
                    443:        int64_t pdpending;
                    444:        int64_t pddeact;
1.55      simonb    445:        int64_t anonpages;
1.69      chs       446:        int64_t filepages;
                    447:        int64_t execpages;
1.60      thorpej   448:        int64_t colorhit;
                    449:        int64_t colormiss;
1.61      thorpej   450:        int64_t ncolors;
1.1       mrg       451: };
                    452:
1.31      thorpej   453: #ifdef _KERNEL
1.97      chs       454: /* we need this before including uvm_page.h on some platforms */
1.45      mrg       455: extern struct uvmexp uvmexp;
                    456: #endif
1.1       mrg       457:
1.45      mrg       458: /*
                    459:  * Finally, bring in standard UVM headers.
                    460:  */
                    461: #include <sys/vmmeter.h>
                    462: #include <sys/queue.h>
1.116     he        463: #include <sys/lock.h>
1.45      mrg       464: #include <uvm/uvm_param.h>
                    465: #include <uvm/uvm_prot.h>
                    466: #include <uvm/uvm_page.h>
                    467: #include <uvm/uvm_pmap.h>
                    468: #include <uvm/uvm_map.h>
                    469: #include <uvm/uvm_pager.h>
                    470:
                    471: /*
1.138     yamt      472:  * helpers for calling ubc_release()
                    473:  */
                    474: #ifdef PMAP_CACHE_VIVT
                    475: #define UBC_WANT_UNMAP(vp) (((vp)->v_iflag & VI_TEXT) != 0)
                    476: #else
                    477: #define UBC_WANT_UNMAP(vp) false
                    478: #endif
                    479:
                    480: /*
1.45      mrg       481:  * Shareable process virtual address space.
                    482:  * May eventually be merged with vm_map.
                    483:  * Several fields are temporary (text, data stuff).
                    484:  */
                    485: struct vmspace {
                    486:        struct  vm_map vm_map;  /* VM address map */
1.92      pk        487:        int     vm_refcnt;      /* number of references *
                    488:                                 * note: protected by vm_map.ref_lock */
1.128     christos  489:        void *  vm_shm;         /* SYS5 shared memory private data XXX */
1.45      mrg       490: /* we copy from vm_startcopy to the end of the structure on fork */
                    491: #define vm_startcopy vm_rssize
1.59      thorpej   492:        segsz_t vm_rssize;      /* current resident set size in pages */
1.45      mrg       493:        segsz_t vm_swrss;       /* resident set size before last swap */
                    494:        segsz_t vm_tsize;       /* text size (pages) XXX */
                    495:        segsz_t vm_dsize;       /* data size (pages) XXX */
                    496:        segsz_t vm_ssize;       /* stack size (pages) */
1.128     christos  497:        void *  vm_taddr;       /* user virtual address of text XXX */
                    498:        void *  vm_daddr;       /* user virtual address of data XXX */
                    499:        void *vm_maxsaddr;      /* user VA at max stack growth */
                    500:        void *vm_minsaddr;      /* user VA at top of stack */
1.45      mrg       501: };
1.111     yamt      502: #define        VMSPACE_IS_KERNEL_P(vm) VM_MAP_IS_KERNEL(&(vm)->vm_map)
1.45      mrg       503:
                    504: #ifdef _KERNEL
1.43      mrg       505:
1.97      chs       506: extern struct pool *uvm_aiobuf_pool;
                    507:
1.43      mrg       508: /*
1.70      thorpej   509:  * used to keep state while iterating over the map for a core dump.
                    510:  */
                    511: struct uvm_coredump_state {
                    512:        void *cookie;           /* opaque for the caller */
                    513:        vaddr_t start;          /* start of region */
1.102     matt      514:        vaddr_t realend;        /* real end of region */
                    515:        vaddr_t end;            /* virtual end of region */
1.70      thorpej   516:        vm_prot_t prot;         /* protection of region */
                    517:        int flags;              /* flags; see below */
                    518: };
                    519:
                    520: #define        UVM_COREDUMP_STACK      0x01    /* region is user stack */
                    521:
                    522: /*
1.43      mrg       523:  * the various kernel maps, owned by MD code
                    524:  */
1.65      chs       525: extern struct vm_map *exec_map;
                    526: extern struct vm_map *kernel_map;
                    527: extern struct vm_map *kmem_map;
                    528: extern struct vm_map *mb_map;
                    529: extern struct vm_map *phys_map;
1.79      thorpej   530:
                    531: /*
1.1       mrg       532:  * macros
                    533:  */
                    534:
1.45      mrg       535: #define vm_resident_count(vm) (pmap_resident_count((vm)->vm_map.pmap))
1.1       mrg       536:
1.77      thorpej   537: #include <sys/mallocvar.h>
                    538: MALLOC_DECLARE(M_VMMAP);
                    539: MALLOC_DECLARE(M_VMPMAP);
1.44      mrg       540:
                    541: /* vm_machdep.c */
1.91      junyoung  542: void           vmapbuf(struct buf *, vsize_t);
                    543: void           vunmapbuf(struct buf *, vsize_t);
1.44      mrg       544: #ifndef        cpu_swapin
1.91      junyoung  545: void           cpu_swapin(struct lwp *);
1.44      mrg       546: #endif
                    547: #ifndef        cpu_swapout
1.91      junyoung  548: void           cpu_swapout(struct lwp *);
1.44      mrg       549: #endif
1.31      thorpej   550:
1.1       mrg       551: /* uvm_aobj.c */
1.91      junyoung  552: struct uvm_object      *uao_create(vsize_t, int);
                    553: void                   uao_detach(struct uvm_object *);
                    554: void                   uao_detach_locked(struct uvm_object *);
                    555: void                   uao_reference(struct uvm_object *);
                    556: void                   uao_reference_locked(struct uvm_object *);
1.1       mrg       557:
1.53      chs       558: /* uvm_bio.c */
1.91      junyoung  559: void                   ubc_init(void);
1.107     yamt      560: void *                 ubc_alloc(struct uvm_object *, voff_t, vsize_t *, int,
                    561:                            int);
1.91      junyoung  562: void                   ubc_release(void *, int);
                    563: void                   ubc_flush(struct uvm_object *, voff_t, voff_t);
1.130     yamt      564: int                    ubc_uiomove(struct uvm_object *, struct uio *, vsize_t,
1.134     yamt      565:                            int, int);
1.53      chs       566:
1.1       mrg       567: /* uvm_fault.c */
1.112     drochner  568: #define uvm_fault(m, a, p) uvm_fault_internal(m, a, p, 0)
                    569: int            uvm_fault_internal(struct vm_map *, vaddr_t, vm_prot_t, int);
                    570:                        /* handle a page fault */
1.1       mrg       571:
                    572: /* uvm_glue.c */
                    573: #if defined(KGDB)
1.128     christos  574: void                   uvm_chgkprot(void *, size_t, int);
1.1       mrg       575: #endif
1.126     thorpej   576: void                   uvm_proc_fork(struct proc *, struct proc *, bool);
1.91      junyoung  577: void                   uvm_lwp_fork(struct lwp *, struct lwp *,
                    578:                            void *, size_t, void (*)(void *), void *);
                    579: int                    uvm_coredump_walkmap(struct proc *,
1.103     matt      580:                            void *,
                    581:                            int (*)(struct proc *, void *,
1.91      junyoung  582:                                    struct uvm_coredump_state *), void *);
                    583: void                   uvm_proc_exit(struct proc *);
                    584: void                   uvm_lwp_exit(struct lwp *);
                    585: void                   uvm_init_limits(struct proc *);
1.128     christos  586: bool                   uvm_kernacc(void *, size_t, int);
1.91      junyoung  587: __dead void            uvm_scheduler(void) __attribute__((noreturn));
1.125     ad        588: void                   uvm_kick_scheduler(void);
1.91      junyoung  589: void                   uvm_swapin(struct lwp *);
1.126     thorpej   590: bool                   uvm_uarea_alloc(vaddr_t *);
1.136     ad        591: void                   uvm_uarea_free(vaddr_t, struct cpu_info *);
1.126     thorpej   592: void                   uvm_uarea_drain(bool);
1.119     chs       593: int                    uvm_vslock(struct vmspace *, void *, size_t, vm_prot_t);
                    594: void                   uvm_vsunlock(struct vmspace *, void *, size_t);
1.131     ad        595: void                   uvm_lwp_hold(struct lwp *);
                    596: void                   uvm_lwp_rele(struct lwp *);
1.135     ad        597: void                   uvm_cpu_attach(struct cpu_info *);
1.1       mrg       598:
                    599:
                    600: /* uvm_init.c */
1.91      junyoung  601: void                   uvm_init(void);
1.1       mrg       602:
                    603: /* uvm_io.c */
1.91      junyoung  604: int                    uvm_io(struct vm_map *, struct uio *);
1.1       mrg       605:
                    606: /* uvm_km.c */
1.100     yamt      607: vaddr_t                        uvm_km_alloc(struct vm_map *, vsize_t, vsize_t,
                    608:                            uvm_flag_t);
                    609: void                   uvm_km_free(struct vm_map *, vaddr_t, vsize_t,
                    610:                            uvm_flag_t);
                    611:
1.91      junyoung  612: struct vm_map          *uvm_km_suballoc(struct vm_map *, vaddr_t *,
1.126     thorpej   613:                            vaddr_t *, vsize_t, int, bool,
1.95      yamt      614:                            struct vm_map_kernel *);
1.126     thorpej   615: vaddr_t                        uvm_km_alloc_poolpage(struct vm_map *, bool);
1.100     yamt      616: void                   uvm_km_free_poolpage(struct vm_map *, vaddr_t);
1.126     thorpej   617: vaddr_t                        uvm_km_alloc_poolpage_cache(struct vm_map *, bool);
1.96      yamt      618: void                   uvm_km_free_poolpage_cache(struct vm_map *, vaddr_t);
                    619: void                   uvm_km_vacache_init(struct vm_map *,
                    620:                            const char *, size_t);
1.65      chs       621:
1.1       mrg       622: /* uvm_map.c */
1.91      junyoung  623: int                    uvm_map(struct vm_map *, vaddr_t *, vsize_t,
                    624:                            struct uvm_object *, voff_t, vsize_t,
                    625:                            uvm_flag_t);
                    626: int                    uvm_map_pageable(struct vm_map *, vaddr_t,
1.126     thorpej   627:                            vaddr_t, bool, int);
1.91      junyoung  628: int                    uvm_map_pageable_all(struct vm_map *, int, vsize_t);
1.126     thorpej   629: bool                   uvm_map_checkprot(struct vm_map *, vaddr_t,
1.91      junyoung  630:                            vaddr_t, vm_prot_t);
                    631: int                    uvm_map_protect(struct vm_map *, vaddr_t,
1.126     thorpej   632:                            vaddr_t, vm_prot_t, bool);
1.91      junyoung  633: struct vmspace         *uvmspace_alloc(vaddr_t, vaddr_t);
                    634: void                   uvmspace_init(struct vmspace *, struct pmap *,
                    635:                            vaddr_t, vaddr_t);
                    636: void                   uvmspace_exec(struct lwp *, vaddr_t, vaddr_t);
                    637: struct vmspace         *uvmspace_fork(struct vmspace *);
1.111     yamt      638: void                   uvmspace_addref(struct vmspace *);
1.91      junyoung  639: void                   uvmspace_free(struct vmspace *);
                    640: void                   uvmspace_share(struct proc *, struct proc *);
                    641: void                   uvmspace_unshare(struct lwp *);
1.1       mrg       642:
                    643:
                    644: /* uvm_meter.c */
1.91      junyoung  645: void                   uvm_meter(void);
                    646: int                    uvm_sysctl(int *, u_int, void *, size_t *,
                    647:                            void *, size_t, struct proc *);
1.118     yamt      648: int                    uvm_pctparam_check(struct uvm_pctparam *, int);
1.108     yamt      649: void                   uvm_pctparam_set(struct uvm_pctparam *, int);
1.118     yamt      650: int                    uvm_pctparam_get(struct uvm_pctparam *);
                    651: void                   uvm_pctparam_init(struct uvm_pctparam *, int,
                    652:                            int (*)(struct uvm_pctparam *, int));
                    653: int                    uvm_pctparam_createsysctlnode(struct uvm_pctparam *,
                    654:                            const char *, const char *);
1.1       mrg       655:
                    656: /* uvm_mmap.c */
1.91      junyoung  657: int                    uvm_mmap(struct vm_map *, vaddr_t *, vsize_t,
                    658:                            vm_prot_t, vm_prot_t, int,
                    659:                            void *, voff_t, vsize_t);
1.99      fvdl      660: vaddr_t                        uvm_default_mapaddr(struct proc *, vaddr_t, vsize_t);
1.1       mrg       661:
1.109     yamt      662: /* uvm_mremap.c */
                    663: int                    uvm_mremap(struct vm_map *, vaddr_t, vsize_t,
                    664:                            struct vm_map *, vaddr_t *, vsize_t,
                    665:                            struct proc *, int);
                    666:
1.120     yamt      667: /* uvm_object.c */
                    668: int                    uobj_wirepages(struct uvm_object *uobj, off_t start,
                    669:                            off_t end);
                    670: void                   uobj_unwirepages(struct uvm_object *uobj, off_t start,
                    671:                            off_t end);
                    672:
1.1       mrg       673: /* uvm_page.c */
1.91      junyoung  674: struct vm_page         *uvm_pagealloc_strat(struct uvm_object *,
                    675:                            voff_t, struct vm_anon *, int, int, int);
1.24      chs       676: #define        uvm_pagealloc(obj, off, anon, flags) \
                    677:            uvm_pagealloc_strat((obj), (off), (anon), (flags), \
                    678:                                UVM_PGA_STRAT_NORMAL, 0)
1.91      junyoung  679: void                   uvm_pagereplace(struct vm_page *,
                    680:                            struct vm_page *);
                    681: void                   uvm_pagerealloc(struct vm_page *,
                    682:                            struct uvm_object *, voff_t);
1.19      eeh       683: /* Actually, uvm_page_physload takes PF#s which need their own type */
1.91      junyoung  684: void                   uvm_page_physload(paddr_t, paddr_t, paddr_t,
                    685:                            paddr_t, int);
                    686: void                   uvm_setpagesize(void);
1.1       mrg       687:
1.53      chs       688: /* uvm_pager.c */
1.91      junyoung  689: void                   uvm_aio_biodone1(struct buf *);
                    690: void                   uvm_aio_biodone(struct buf *);
                    691: void                   uvm_aio_aiodone(struct buf *);
1.53      chs       692:
1.1       mrg       693: /* uvm_pdaemon.c */
1.91      junyoung  694: void                   uvm_pageout(void *);
1.124     yamt      695: struct work;
                    696: void                   uvm_aiodone_worker(struct work *, void *);
1.118     yamt      697: void                   uvm_estimatepageable(int *, int *);
1.1       mrg       698:
                    699: /* uvm_pglist.c */
1.91      junyoung  700: int                    uvm_pglistalloc(psize_t, paddr_t, paddr_t,
                    701:                            paddr_t, paddr_t, struct pglist *, int, int);
                    702: void                   uvm_pglistfree(struct pglist *);
1.1       mrg       703:
                    704: /* uvm_swap.c */
1.91      junyoung  705: void                   uvm_swap_init(void);
1.1       mrg       706:
                    707: /* uvm_unix.c */
1.91      junyoung  708: int                    uvm_grow(struct proc *, vaddr_t);
1.1       mrg       709:
                    710: /* uvm_user.c */
1.91      junyoung  711: void                   uvm_deallocate(struct vm_map *, vaddr_t, vsize_t);
1.1       mrg       712:
                    713: /* uvm_vnode.c */
1.91      junyoung  714: void                   uvm_vnp_setsize(struct vnode *, voff_t);
1.130     yamt      715: void                   uvm_vnp_setwritesize(struct vnode *, voff_t);
1.91      junyoung  716: int                    uvn_findpages(struct uvm_object *, voff_t,
                    717:                            int *, struct vm_page **, int);
                    718: void                   uvm_vnp_zerorange(struct vnode *, off_t, size_t);
1.126     thorpej   719: bool                   uvn_text_p(struct uvm_object *);
                    720: bool                   uvn_clean_p(struct uvm_object *);
                    721: bool                   uvn_needs_writefault_p(struct uvm_object *);
1.37      thorpej   722:
                    723: /* kern_malloc.c */
1.91      junyoung  724: void                   kmeminit_nkmempages(void);
                    725: void                   kmeminit(void);
1.37      thorpej   726: extern int             nkmempages;
1.1       mrg       727:
1.31      thorpej   728: #endif /* _KERNEL */
                    729:
1.8       perry     730: #endif /* _UVM_UVM_EXTERN_H_ */

CVSweb <webmaster@jp.NetBSD.org>