|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * Mach Operating System
24: * Copyright (c) 1987 Carnegie-Mellon University
25: * All rights reserved. The CMU software License Agreement specifies
26: * the terms and conditions for use and redistribution.
27: */
28:
29: #ifndef _VNODE_PAGER_
30: #define _VNODE_PAGER_ 1
31:
32: #include <mach/kern_return.h>
33: #include <sys/types.h>
34: #include <kern/queue.h>
35:
36: kern_return_t mach_swapon();
37:
38: #ifdef KERNEL
39:
40: #include <mach/boolean.h>
41: #include <vm/vm_pager.h>
42:
43: void vnode_pager_init();
44:
45: vm_pager_t vnode_pager_setup();
46: boolean_t vnode_has_page();
47: boolean_t vnode_pager_active();
48:
49: /*
50: * Vstructs are the internal (to us) description of a unit of backing store.
51: * The are the link between memory objects and the backing store they represent.
52: * For the vnode pager, backing store comes in two flavors: normal files and
53: * swap files.
54: *
55: * For objects that page to and from normal files (e.g. objects that represent
56: * program text segments), we maintain some simple parameters that allow us to
57: * access the file's contents directly through the vnode interface.
58: *
59: * Data for objects without associated vnodes is maintained in the swap files.
60: * Each object that uses one of these as backing store has a vstruct indicating
61: * the swap file of preference (vs_pf) and a mapping between contiguous object
62: * offsets and swap file offsets (vs_pmap). Each entry in this mapping specifies
63: * the pager file to use, and the offset of the page in that pager file. These
64: * mapping entries are of type pfMapEntry.
65: */
66:
67: /*
68: * Pager file structure. One per swap file.
69: */
70: typedef struct pager_file {
71: queue_chain_t pf_chain; /* link to other paging files */
72: struct vnode *pf_vp; /* vnode of paging file */
73: u_int pf_count; /* Number of vstruct using this file */
74: u_char *pf_bmap; /* Map of used blocks */
75: long pf_npgs; /* Size of file in pages */
76: long pf_pfree; /* Number of unused pages */
77: long pf_lowat; /* Low water page */
78: long pf_hipage; /* Highest page allocated */
79: long pf_hint; /* Lowest page unallocated */
80: char *pf_name; /* Filename of this file */
81: boolean_t pf_prefer;
82: int pf_index; /* index into the pager_file array */
83: void * pf_lock; /* Lock for alloc and dealloc */
84: } *pager_file_t;
85:
86: #define PAGER_FILE_NULL (pager_file_t) 0
87:
88: #define MAXPAGERFILES 16
89:
90: #define MAX_BACKING_STORE 100
91:
92: struct bs_map {
93: struct vnode *vp;
94: void *bs;
95: };
96:
97:
98:
99: /*
100: * Pager file data structures.
101: */
102: #define INDEX_NULL 0
103: typedef struct {
104: unsigned int index:8; /* paging file this block is in */
105: unsigned int offset:24; /* page number where block resides */
106: } pf_entry;
107:
108: typedef enum {
109: IS_INODE, /* Local disk */
110: IS_RNODE /* NFS */
111: } vpager_fstype;
112:
113: /*
114: * Basic vnode pager structure. One per object, backing-store pair.
115: */
116: typedef struct vstruct {
117: boolean_t is_device; /* Must be first - see vm_pager.h */
118: pager_file_t vs_pf; /* Pager file this uses */
119: pf_entry **vs_pmap; /* Map of pages into paging file */
120: unsigned int
121: /* boolean_t */ vs_swapfile:1; /* vnode is a swapfile */
122: short vs_count; /* use count */
123: int vs_size; /* size of this chunk in pages*/
124: struct vnode *vs_vp; /* vnode to page to */
125: } *vnode_pager_t;
126:
127: #define VNODE_PAGER_NULL ((vnode_pager_t) 0)
128:
129:
130:
131: pager_return_t pager_vnode_pagein();
132: pager_return_t pager_vnode_pageout();
133: pager_return_t vnode_pagein();
134: pager_return_t vnode_pageout();
135: void vnode_dealloc();
136: vm_pager_t vnode_alloc();
137: int vnode_uncache();
138:
139: #endif /* KERNEL */
140:
141: #endif /* _VNODE_PAGER_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.