[BACK]Return to uvm_pager.h CVS log [TXT][DIR] Up to [local] / sys / uvm

Annotation of sys/uvm/uvm_pager.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: uvm_pager.h,v 1.20 2003/06/02 23:28:24 millert Exp $  */
                      2: /*     $NetBSD: uvm_pager.h,v 1.20 2000/11/27 08:40:05 chs Exp $       */
                      3:
                      4: /*
                      5:  *
                      6:  * Copyright (c) 1997 Charles D. Cranor and Washington University.
                      7:  * All rights reserved.
                      8:  *
                      9:  * Redistribution and use in source and binary forms, with or without
                     10:  * modification, are permitted provided that the following conditions
                     11:  * are met:
                     12:  * 1. Redistributions of source code must retain the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer.
                     14:  * 2. Redistributions in binary form must reproduce the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer in the
                     16:  *    documentation and/or other materials provided with the distribution.
                     17:  * 3. All advertising materials mentioning features or use of this software
                     18:  *    must display the following acknowledgement:
                     19:  *      This product includes software developed by Charles D. Cranor and
                     20:  *      Washington University.
                     21:  * 4. The name of the author may not be used to endorse or promote products
                     22:  *    derived from this software without specific prior written permission.
                     23:  *
                     24:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     25:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     26:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     27:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     28:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     29:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     30:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     31:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     32:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     33:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     34:  *
                     35:  * from: Id: uvm_pager.h,v 1.1.2.14 1998/01/13 19:00:50 chuck Exp
                     36:  */
                     37:
                     38: /*
                     39:  * Copyright (c) 1990 University of Utah.
                     40:  * Copyright (c) 1991, 1993
                     41:  *     The Regents of the University of California.  All rights reserved.
                     42:  *
                     43:  * This code is derived from software contributed to Berkeley by
                     44:  * the Systems Programming Group of the University of Utah Computer
                     45:  * Science Department.
                     46:  *
                     47:  * Redistribution and use in source and binary forms, with or without
                     48:  * modification, are permitted provided that the following conditions
                     49:  * are met:
                     50:  * 1. Redistributions of source code must retain the above copyright
                     51:  *    notice, this list of conditions and the following disclaimer.
                     52:  * 2. Redistributions in binary form must reproduce the above copyright
                     53:  *    notice, this list of conditions and the following disclaimer in the
                     54:  *    documentation and/or other materials provided with the distribution.
                     55:  * 3. Neither the name of the University nor the names of its contributors
                     56:  *    may be used to endorse or promote products derived from this software
                     57:  *    without specific prior written permission.
                     58:  *
                     59:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     60:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     61:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     62:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     63:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     64:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     65:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     66:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     67:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     68:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     69:  * SUCH DAMAGE.
                     70:  *
                     71:  *     @(#)vm_pager.h  8.5 (Berkeley) 7/7/94
                     72:  */
                     73:
                     74: #ifndef _UVM_UVM_PAGER_H_
                     75: #define _UVM_UVM_PAGER_H_
                     76:
                     77: /*
                     78:  * uvm_pager.h
                     79:  */
                     80:
                     81: /*
                     82:  * pager ops
                     83:  */
                     84:
                     85: struct uvm_pagerops {
                     86:                                                /* init pager */
                     87:        void                    (*pgo_init)(void);
                     88:                                                /* add reference to obj */
                     89:        void                    (*pgo_reference)(struct uvm_object *);
                     90:                                                /* drop reference to obj */
                     91:        void                    (*pgo_detach)(struct uvm_object *);
                     92:                                                /* special nonstd fault fn */
                     93:        int                     (*pgo_fault)(struct uvm_faultinfo *, vaddr_t,
                     94:                                 vm_page_t *, int, int, vm_fault_t,
                     95:                                 vm_prot_t, int);
                     96:                                                /* flush pages out of obj */
                     97:        boolean_t               (*pgo_flush)(struct uvm_object *, voff_t,
                     98:                                 voff_t, int);
                     99:                                                /* get/read page */
                    100:        int                     (*pgo_get)(struct uvm_object *, voff_t,
                    101:                                 vm_page_t *, int *, int, vm_prot_t, int, int);
                    102:                                                /* put/write page */
                    103:        int                     (*pgo_put)(struct uvm_object *, vm_page_t *,
                    104:                                 int, boolean_t);
                    105:                                                /* return range of cluster */
                    106:        void                    (*pgo_cluster)(struct uvm_object *, voff_t,
                    107:                                 voff_t *, voff_t *);
                    108:                                                /* make "put" cluster */
                    109:        struct vm_page **       (*pgo_mk_pcluster)(struct uvm_object *,
                    110:                                 struct vm_page **, int *, struct vm_page *,
                    111:                                 int, voff_t, voff_t);
                    112:                                                /* release page */
                    113:        boolean_t               (*pgo_releasepg)(struct vm_page *, struct vm_page **);
                    114: };
                    115:
                    116: /* pager flags [mostly for flush] */
                    117:
                    118: #define PGO_CLEANIT    0x001   /* write dirty pages to backing store */
                    119: #define PGO_SYNCIO     0x002   /* if PGO_CLEANIT: use sync I/O? */
                    120: #define PGO_DEACTIVATE 0x004   /* deactivate flushed pages */
                    121: #define PGO_FREE       0x008   /* free flushed pages */
                    122: /* if PGO_FREE is not set then the pages stay where they are. */
                    123:
                    124: #define PGO_ALLPAGES   0x010   /* flush whole object/get all pages */
                    125: #define PGO_DOACTCLUST 0x020   /* flag to mk_pcluster to include active */
                    126: #define PGO_LOCKED     0x040   /* fault data structures are locked [get] */
                    127: #define PGO_PDFREECLUST        0x080   /* daemon's free cluster flag [uvm_pager_put] */
                    128: #define PGO_REALLOCSWAP        0x100   /* reallocate swap area [pager_dropcluster] */
                    129: #define PGO_OVERWRITE  0x200   /* pages will be overwritten before unlocked */
                    130: #define PGO_WEAK       0x400   /* "weak" put, for nfs */
                    131: #define PGO_PASTEOF    0x800   /* allow allocation of pages past EOF */
                    132:
                    133: /* page we are not interested in getting */
                    134: #define PGO_DONTCARE ((struct vm_page *) -1L)  /* [get only] */
                    135:
                    136: #ifdef _KERNEL
                    137:
                    138: /*
                    139:  * handle inline options
                    140:  */
                    141:
                    142: #ifdef UVM_PAGER_INLINE
                    143: #define PAGER_INLINE static __inline
                    144: #else
                    145: #define PAGER_INLINE /* nothing */
                    146: #endif /* UVM_PAGER_INLINE */
                    147:
                    148: /*
                    149:  * prototypes
                    150:  */
                    151:
                    152: void           uvm_pager_dropcluster(struct uvm_object *,
                    153:                                        struct vm_page *, struct vm_page **,
                    154:                                        int *, int);
                    155: void           uvm_pager_init(void);
                    156: int            uvm_pager_put(struct uvm_object *, struct vm_page *,
                    157:                                   struct vm_page ***, int *, int,
                    158:                                   voff_t, voff_t);
                    159:
                    160: PAGER_INLINE struct vm_page *uvm_pageratop(vaddr_t);
                    161:
                    162: vaddr_t                uvm_pagermapin(struct vm_page **, int, int);
                    163: void           uvm_pagermapout(vaddr_t, int);
                    164: struct vm_page **uvm_mk_pcluster(struct uvm_object *, struct vm_page **,
                    165:                                       int *, struct vm_page *, int,
                    166:                                       voff_t, voff_t);
                    167: int            uvm_errno2vmerror(int);
                    168:
                    169: /* Flags to uvm_pagermapin() */
                    170: #define        UVMPAGER_MAPIN_WAITOK   0x01    /* it's okay to wait */
                    171: #define        UVMPAGER_MAPIN_READ     0x02    /* host <- device */
                    172: #define        UVMPAGER_MAPIN_WRITE    0x00    /* device -> host (pseudo flag) */
                    173:
                    174: /*
                    175:  * get/put return values
                    176:  * OK     operation was successful
                    177:  * BAD    specified data was out of the accepted range
                    178:  * FAIL           specified data was in range, but doesn't exist
                    179:  * PEND           operations was initiated but not completed
                    180:  * ERROR   error while accessing data that is in range and exists
                    181:  * AGAIN   temporary resource shortage prevented operation from happening
                    182:  * UNLOCK  unlock the map and try again
                    183:  * REFAULT [uvm_fault internal use only!] unable to relock data structures,
                    184:  *         thus the mapping needs to be reverified before we can procede
                    185:  */
                    186: #define        VM_PAGER_OK             0
                    187: #define        VM_PAGER_BAD            1
                    188: #define        VM_PAGER_FAIL           2
                    189: #define        VM_PAGER_PEND           3
                    190: #define        VM_PAGER_ERROR          4
                    191: #define VM_PAGER_AGAIN         5
                    192: #define VM_PAGER_UNLOCK                6
                    193: #define VM_PAGER_REFAULT       7
                    194:
                    195: /*
                    196:  * XXX
                    197:  * this is needed until the device strategy interface
                    198:  * is changed to do physically-addressed i/o.
                    199:  */
                    200:
                    201: #ifndef PAGER_MAP_SIZE
                    202: #define PAGER_MAP_SIZE       (16 * 1024 * 1024)
                    203: #endif
                    204:
                    205: #endif /* _KERNEL */
                    206:
                    207: #endif /* _UVM_UVM_PAGER_H_ */

CVSweb