xref: /dragonfly/sys/vm/vm_page.h (revision 14067db606f14f728f62891ebcdc30366e95aa3d)
1 /*
2  * Copyright (c) 1991, 1993
3  *        The Regents of the University of California.  All rights reserved.
4  * Copyright (c) 2003-2019 The DragonFly Project.  All rights reserved.
5  *
6  * This code is derived from software contributed to Berkeley by
7  * The Mach Operating System project at Carnegie-Mellon University.
8  *
9  * This code is derived from software contributed to The DragonFly Project
10  * by Matthew Dillon <dillon@backplane.com>
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions and the following disclaimer.
17  * 2. Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the distribution.
20  * 3. Neither the name of the University nor the names of its contributors
21  *    may be used to endorse or promote products derived from this software
22  *    without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34  * SUCH DAMAGE.
35  *
36  *        from: @(#)vm_page.h 8.2 (Berkeley) 12/13/93
37  *
38  *
39  * Copyright (c) 1987, 1990 Carnegie-Mellon University.
40  * All rights reserved.
41  *
42  * Authors: Avadis Tevanian, Jr., Michael Wayne Young
43  *
44  * Permission to use, copy, modify and distribute this software and
45  * its documentation is hereby granted, provided that both the copyright
46  * notice and this permission notice appear in all copies of the
47  * software, derivative works or modified versions, and any portions
48  * thereof, and that both notices appear in supporting documentation.
49  *
50  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
51  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
52  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
53  *
54  * Carnegie Mellon requests users of this software to return to
55  *
56  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
57  *  School of Computer Science
58  *  Carnegie Mellon University
59  *  Pittsburgh PA 15213-3890
60  *
61  * any improvements or extensions that they make and grant Carnegie the
62  * rights to redistribute these changes.
63  */
64 
65 /*
66  * Resident memory system definitions.
67  */
68 
69 #ifndef   _VM_VM_PAGE_H_
70 #define   _VM_VM_PAGE_H_
71 
72 #ifndef _SYS_TYPES_H_
73 #include <sys/types.h>
74 #endif
75 #ifndef _SYS_TREE_H_
76 #include <sys/tree.h>
77 #endif
78 #ifndef _MACHINE_PMAP_H_
79 #include <machine/pmap.h>
80 #endif
81 #ifndef _VM_PMAP_H_
82 #include <vm/pmap.h>
83 #endif
84 #include <machine/atomic.h>
85 
86 #ifdef _KERNEL
87 
88 #ifndef _SYS_SYSTM_H_
89 #include <sys/systm.h>
90 #endif
91 #ifndef _SYS_SPINLOCK_H_
92 #include <sys/spinlock.h>
93 #endif
94 
95 #ifdef __x86_64__
96 #include <machine/vmparam.h>
97 #endif
98 
99 #endif
100 
101 /*
102  * The vm_page structure is the heart of the entire system.  It's fairly
103  * bulky, eating 3.125% of available memory (128 bytes vs 4K page size).
104  * Most normal uses of the structure, representing physical memory, uses
105  * the type-stable vm_page_array[].  Device mappings exposed to mmap()
106  * (such as GPUs) generally use temporary vm_page's outside of this array
107  * and will be flagged FICTITIOUS.  Devices which use the kernel's contig
108  * memory allocator get normal pages, but for convenience the pages will
109  * be temporarily flagged as FICTITIOUS.
110  *
111  * Soft-busying or Hard-busying guarantees a stable m->object, m->pindex,
112  * and m->valid field.  A page cannot be validated or invalidated unless
113  * hard-busied.
114  *
115  * The page must be hard-busied to make the following changes:
116  *
117  *        (1) Any change to m->object or m->pindex (also requires the
118  *            related object to be exclusively locked).
119  *
120  *        (2) Any transition of m->wire_count to 0 or from 0.  Other
121  *            transitions (e.g. 2->1, 1->2, etc) are allowed without
122  *            locks.
123  *
124  *        (3) Any change to m->valid.
125  *
126  *        (4) Clearing PG_MAPPED or PG_WRITEABLE (note that because of
127  *            this, these bits may be left lazily set until they can
128  *            be cleared later on.
129  *
130  * Most other fields of the vm_page can change at any time with certain
131  * restrictions.
132  *
133  *        (1) PG_WRITEABLE and PG_MAPPED may be set with the page soft-busied
134  *            or hard-busied.
135  *
136  *        (2) m->dirty may be set to VM_PAGE_BITS_ALL by a page fault at
137  *            any time if PG_WRITEABLE is flagged.  Tests of m->dirty are
138  *            only tentative until all writeable mappings of the page are
139  *            removed.  This may occur unlocked.  A hard-busy is required
140  *            if modifying m->dirty under other conditions.
141  *
142  *        (3) PG_REFERENCED may be set at any time by the pmap code to
143  *            synchronized the [A]ccessed bit, if PG_MAPPED is flagged,
144  *            unlocked.  A hard-busy is required for any other time.
145  *
146  *        (3) hold_count can be incremented or decremented at any time,
147  *            including transitions to or from 0.  Holding a page via
148  *            vm_page_hold() does NOT stop major changes from being made
149  *            to the page, but WILL prevent the page from being freed
150  *            or reallocated.  If the hold is emplaced with the page in
151  *            a known state it can prevent the underlying data from being
152  *            destroyed.
153  *
154  *        (4) Each individual flag may have a different behavior.  Some flags
155  *            can be set or cleared at any time, some require hard-busying,
156  *            etc.
157  *
158  * Moving the page between queues (aka m->pageq and m->queue) requires
159  * m->spin to be exclusively locked first, and then also the spinlock related
160  * to the queue.
161  *
162  *        (1) This is the only use that requires m->spin any more.
163  *
164  *        (2) There is one special case and that is the pageout daemon is
165  *            allowed to reorder the page within the same queue while just
166  *            holding the queue's spin-lock.
167  *
168  * Please see the flags section below for flag documentation.
169  */
170 TAILQ_HEAD(pglist, vm_page);
171 
172 struct vm_object;
173 
174 int rb_vm_page_compare(struct vm_page *, struct vm_page *);
175 
176 struct vm_page_rb_tree;
177 RB_PROTOTYPE2(vm_page_rb_tree, vm_page, rb_entry,
178                 rb_vm_page_compare, vm_pindex_t);
179 RB_HEAD(vm_page_rb_tree, vm_page);
180 
181 struct vm_page {
182           TAILQ_ENTRY(vm_page) pageq;   /* vm_page_queues[] list      */
183           RB_ENTRY(vm_page) rb_entry;   /* Red-Black tree based at object */
184           struct spinlock     spin;
185           struct md_page md;            /* machine dependant stuff */
186           uint32_t wire_count;                    /* wired down maps refs (P) */
187           uint32_t busy_count;                    /* soft-busy and hard-busy */
188           int       hold_count;                   /* page hold count */
189           int       ku_pagecnt;                   /* help kmalloc() w/oversized allocs */
190           struct vm_object *object;     /* which object am I in */
191           vm_pindex_t pindex;           /* offset into object */
192           vm_paddr_t phys_addr;                   /* physical address of page */
193           uint16_t queue;                         /* page queue index */
194           uint16_t pc;                            /* page color */
195           uint8_t   act_count;                    /* page usage count */
196           uint8_t   pat_mode;           /* hardware page attribute */
197           uint8_t   valid;                        /* map of valid DEV_BSIZE chunks */
198           uint8_t   dirty;                        /* map of dirty DEV_BSIZE chunks */
199           uint32_t flags;                         /* see below */
200           int       unused01;           /* available */
201           /* 128 bytes */
202 #ifdef VM_PAGE_DEBUG
203           const char *busy_func;
204           int       busy_line;
205 #endif
206 };
207 
208 #define PBUSY_LOCKED                    0x80000000U
209 #define PBUSY_WANTED                    0x40000000U
210 #define PBUSY_SWAPINPROG      0x20000000U
211 #define PBUSY_MASK            0x1FFFFFFFU
212 
213 #ifndef __VM_PAGE_T_DEFINED__
214 #define __VM_PAGE_T_DEFINED__
215 typedef struct vm_page *vm_page_t;
216 #endif
217 
218 /*
219  * Page coloring parameters.  We use generous parameters designed to
220  * statistically spread pages over available cpu cache space.  This has
221  * become less important over time as cache associativity is higher
222  * in modern times but we still use the core algorithm to help reduce
223  * lock contention between cpus.
224  *
225  * Page coloring cannot be disabled.
226  *
227  * In today's world of many-core systems, we must be able to provide enough VM
228  * page queues for each logical cpu thread to cover the L1/L2/L3 cache set
229  * associativity.  If we don't, the cpu caches will not be properly utilized.
230  *
231  * Using 2048 allows 8-way set-assoc with 256 logical cpus, but seems to
232  * have a number of downsides when queues are assymetrically starved.
233  *
234  * Using 1024 allows 4-way set-assoc with 256 logical cpus, and more with
235  * fewer cpus.
236  */
237 #define PQ_PRIME1 31          /* Prime number somewhat less than PQ_HASH_SIZE */
238 #define PQ_PRIME2 23          /* Prime number somewhat less than PQ_HASH_SIZE */
239 #define PQ_L2_SIZE 1024       /* Must be enough for maximal ncpus x hw set-assoc */
240 #define PQ_L2_MASK  (PQ_L2_SIZE - 1)
241 
242 #define PQ_NONE               0
243 #define PQ_FREE               (1 + 0*PQ_L2_SIZE)
244 #define PQ_INACTIVE (1 + 1*PQ_L2_SIZE)
245 #define PQ_ACTIVE   (1 + 2*PQ_L2_SIZE)
246 #define PQ_CACHE    (1 + 3*PQ_L2_SIZE)
247 #define PQ_HOLD               (1 + 4*PQ_L2_SIZE)
248 #define PQ_COUNT    (1 + 5*PQ_L2_SIZE)
249 
250 /*
251  * Scan support
252  */
253 struct vm_map;
254 
255 struct rb_vm_page_scan_info {
256           vm_pindex_t         start_pindex;
257           vm_pindex_t         end_pindex;
258           int                 limit;
259           int                 desired;
260           int                 error;
261           int                 pagerflags;
262           int                 count;
263           int                 unused01;
264           vm_offset_t         addr;
265           struct vm_map_entry *entry;
266           struct vm_object *object;
267           struct vm_object *dest_object;
268           struct vm_page      *mpte;
269           struct pmap         *pmap;
270           struct vm_map       *map;
271 };
272 
273 int rb_vm_page_scancmp(struct vm_page *, void *);
274 
275 struct vpgqueues {
276           struct spinlock spin;
277           struct pglist pl;
278           long      lcnt;
279           long      adds;               /* heuristic, add operations */
280           int       cnt_offset;         /* offset into vmstats structure (int) */
281           int       lastq;              /* heuristic, skip empty queues */
282 } __aligned(64);
283 
284 extern struct vpgqueues vm_page_queues[PQ_COUNT];
285 
286 /*
287  * The m->flags field is generally categorized as follows.  Unless otherwise
288  * noted, a flag may only be updated while the page is hard-busied.
289  *
290  * PG_UNQUEUED         - This prevents the page from being placed on any queue.
291  *
292  * PG_FICTITIOUS   - This indicates to the pmap subsystem that the
293  *                       page might not be reverse-addressable via
294  *                       PHYS_TO_VM_PAGE().   The vm_page_t might be
295  *                       temporary and not exist in the vm_page_array[].
296  *
297  *                       This also generally means that the pmap subsystem
298  *                       cannot synchronize the [M]odified and [A]ccessed
299  *                       bits with the related vm_page_t, and in fact that
300  *                       there might not even BE a related vm_page_t.
301  *
302  *                       Unlike the old system, the new pmap subsystem is
303  *                       able to do bulk operations on virtual address ranges
304  *                       containing fictitious pages, and can also pick-out
305  *                       specific fictitious pages by matching m->phys_addr
306  *                       if you supply a fake vm_page to it.
307  *
308  *                       Fictitious pages can still be organized into vm_objects
309  *                       if desired.
310  *
311  * PG_MAPPED           - Indicates that the page MIGHT be mapped into a pmap.
312  *                       If not set, guarantees that the page is not mapped.
313  *
314  *                       This bit can be set unlocked but only cleared while
315  *                       vm_page is hard-busied.
316  *
317  *                       For FICTITIOUS pages, this bit will be set automatically
318  *                       via a page fault (aka pmap_enter()), but must be cleared
319  *                       manually.
320  *
321  * PG_MAPPEDMULTI  - Possibly mapped to multiple pmaps or to multiple locations
322  *                       ine one pmap.
323  *
324  * PG_WRITEABLE    - Indicates that the page MIGHT be writeable via a pte.
325  *                       If not set, guarantees that the page is not writeable.
326  *
327  *                       This bit can be set unlocked but only cleared while
328  *                       vm_page is hard-busied.
329  *
330  *                       For FICTITIOUS pages, this bit will be set automatically
331  *                       via a page fault (aka pmap_enter()), but must be cleared
332  *                       manually.
333  *
334  * PG_SWAPPED          - Indicates that the page is backed by a swap block.
335  *                       Any VM object type other than OBJT_DEFAULT can contain
336  *                       swap-backed pages now.  The bit may only be adjusted
337  *                       while the page is hard-busied.
338  *
339  * PG_RAM    - Heuristic read-ahead-marker.  When I/O brings pages in,
340  *                       this bit is set on one of them to force a page fault on
341  *                       it to proactively read-ahead additional pages.
342  *
343  *                       Can be set or cleared at any time unlocked.
344  *
345  * PG_WINATCFLS        - This is used to give dirty pages a second chance
346  *                       on the inactive queue before getting flushed by
347  *                       the pageout daemon.
348  *
349  * PG_REFERENCED   - Indicates that the page has been accessed.  If the
350  *                       page is PG_MAPPED, this bit might not reflect the
351  *                       actual state of the page.  The pmap code synchronizes
352  *                       the [A]ccessed bit to this flag and then clears the
353  *                       [A]ccessed bit.
354  *
355  * PG_MARKER           - Used by any queue-scanning code to recognize a fake
356  *                       vm_page being used only as a scan marker.
357  *
358  * PG_NOTMETA          - Distinguish pages representing content from pages
359  *                       representing meta-data.
360  *
361  * PG_NEED_COMMIT  - May only be modified while the page is hard-busied.
362  *                       Indicates that even if the page might not appear to
363  *                       be dirty, it must still be validated against some
364  *                       remote entity (e.g. NFS) before it can be thrown away.
365  *
366  * PG_CLEANCHK         - Used by the vm_object subsystem to detect pages that
367  *                       might have been inserted during a scan.  May be changed
368  *                       at any time by the VM system (usually while holding the
369  *                       related vm_object's lock).
370  */
371 #define   PG_UNUSED0001       0x00000001
372 #define   PG_UNUSED0002       0x00000002
373 #define PG_WINATCFLS          0x00000004          /* flush dirty page on inactive q */
374 #define   PG_FICTITIOUS       0x00000008          /* No reverse-map or tracking */
375 #define   PG_WRITEABLE        0x00000010          /* page may be writeable */
376 #define PG_MAPPED   0x00000020          /* page may be mapped (managed) */
377 #define   PG_MAPPEDMULTI      0x00000040          /* multiple mappings */
378 #define PG_REFERENCED         0x00000080          /* page has been referenced */
379 #define PG_CLEANCHK 0x00000100          /* page will be checked for cleaning */
380 #define PG_UNUSED0200         0x00000200
381 #define PG_NOSYNC   0x00000400          /* do not collect for syncer */
382 #define PG_UNQUEUED 0x00000800          /* No queue management for page */
383 #define PG_MARKER   0x00001000          /* special queue marker page */
384 #define PG_RAM                0x00002000          /* read ahead mark */
385 #define PG_SWAPPED  0x00004000          /* backed by swap */
386 #define PG_NOTMETA  0x00008000          /* do not back with swap */
387 #define PG_UNUSED10000        0x00010000
388 #define PG_UNUSED20000        0x00020000
389 #define PG_NEED_COMMIT        0x00040000          /* clean page requires commit */
390 
391 #define PG_KEEP_NEWPAGE_MASK  (0)
392 
393 /*
394  * Misc constants.
395  */
396 
397 #define ACT_DECLINE           1
398 #define ACT_ADVANCE           3
399 #define ACT_INIT              5
400 #define ACT_MAX                         64
401 
402 #ifdef VM_PAGE_DEBUG
403 #define VM_PAGE_DEBUG_EXT(name)         name ## _debug
404 #define VM_PAGE_DEBUG_ARGS    , const char *func, int lineno
405 #else
406 #define VM_PAGE_DEBUG_EXT(name)         name
407 #define VM_PAGE_DEBUG_ARGS
408 #endif
409 
410 #ifdef _KERNEL
411 /*
412  * Each pageable resident page falls into one of four lists:
413  *
414  *        free
415  *                  Available for allocation now.
416  *
417  * The following are all LRU sorted:
418  *
419  *        cache
420  *                  Almost available for allocation. Still in an
421  *                  object, but clean and immediately freeable at
422  *                  non-interrupt times.
423  *
424  *        inactive
425  *                  Low activity, candidates for reclamation.
426  *                  This is the list of pages that should be
427  *                  paged out next.
428  *
429  *        active
430  *                  Pages that are "active" i.e. they have been
431  *                  recently referenced.
432  *
433  *        zero
434  *                  Pages that are really free and have been pre-zeroed
435  *
436  */
437 
438 extern struct vm_page *vm_page_array;   /* First resident page in table */
439 extern vm_pindex_t vm_page_array_size;  /* number of vm_page_t's */
440 extern vm_pindex_t first_page;                    /* first physical page number */
441 
442 #define VM_PAGE_TO_PHYS(entry)          \
443                     ((entry)->phys_addr)
444 
445 #define PHYS_TO_VM_PAGE(pa)   \
446                     (&vm_page_array[atop(pa) - first_page])
447 
448 
449 #if PAGE_SIZE == 4096
450 #define VM_PAGE_BITS_ALL 0xff
451 #endif
452 
453 /*
454  * Note: the code will always use nominally free pages from the free list
455  * before trying other flag-specified sources.
456  *
457  * At least one of VM_ALLOC_NORMAL|VM_ALLOC_SYSTEM|VM_ALLOC_INTERRUPT
458  * must be specified.  VM_ALLOC_RETRY may only be specified if VM_ALLOC_NORMAL
459  * is also specified.
460  */
461 #define VM_ALLOC_NORMAL                 0x0001    /* ok to use cache pages */
462 #define VM_ALLOC_SYSTEM                 0x0002    /* ok to exhaust most of free list */
463 #define VM_ALLOC_INTERRUPT    0x0004    /* ok to exhaust entire free list */
464 #define   VM_ALLOC_ZERO                 0x0008    /* req pre-zero'd memory if avail */
465 #define   VM_ALLOC_QUICK                0x0010    /* like NORMAL but do not use cache */
466 #define VM_ALLOC_FORCE_ZERO   0x0020    /* zero page even if already valid */
467 #define VM_ALLOC_NULL_OK      0x0040    /* ok to return NULL on collision */
468 #define   VM_ALLOC_RETRY                0x0080    /* indefinite block (vm_page_grab()) */
469 #define VM_ALLOC_USE_GD                 0x0100    /* use per-gd cache */
470 #define VM_ALLOC_CPU_SPEC     0x0200
471 
472 #define VM_ALLOC_CPU_SHIFT    16
473 #define VM_ALLOC_CPU(n)                 (((n) << VM_ALLOC_CPU_SHIFT) | \
474                                          VM_ALLOC_CPU_SPEC)
475 #define VM_ALLOC_GETCPU(flags)          ((flags) >> VM_ALLOC_CPU_SHIFT)
476 
477 void vm_page_queue_spin_lock(vm_page_t);
478 void vm_page_queues_spin_lock(u_short);
479 void vm_page_and_queue_spin_lock(vm_page_t);
480 
481 void vm_page_queue_spin_unlock(vm_page_t);
482 void vm_page_queues_spin_unlock(u_short);
483 void vm_page_and_queue_spin_unlock(vm_page_t m);
484 
485 void vm_page_init(vm_page_t m);
486 void vm_page_io_finish(vm_page_t m);
487 void vm_page_io_start(vm_page_t m);
488 void vm_page_need_commit(vm_page_t m);
489 void vm_page_clear_commit(vm_page_t m);
490 void vm_page_wakeup(vm_page_t m);
491 void vm_page_hold(vm_page_t);
492 void vm_page_unhold(vm_page_t);
493 void vm_page_activate (vm_page_t);
494 void vm_page_soft_activate (vm_page_t);
495 
496 vm_size_t vm_contig_avail_pages(void);
497 vm_page_t vm_page_alloc (struct vm_object *, vm_pindex_t, int);
498 vm_page_t vm_page_alloczwq (vm_pindex_t, int);
499 void vm_page_freezwq (vm_page_t m);
500 vm_page_t vm_page_alloc_contig(vm_paddr_t low, vm_paddr_t high,
501                      unsigned long alignment, unsigned long boundary,
502                          unsigned long size, vm_memattr_t memattr);
503 
504 vm_page_t vm_page_grab (struct vm_object *, vm_pindex_t, int);
505 void vm_page_cache (vm_page_t);
506 int vm_page_try_to_cache (vm_page_t);
507 int vm_page_try_to_free (vm_page_t);
508 void vm_page_dontneed (vm_page_t);
509 void vm_page_deactivate (vm_page_t);
510 void vm_page_deactivate_locked (vm_page_t);
511 void vm_page_initfake(vm_page_t m, vm_paddr_t paddr, vm_memattr_t memattr);
512 int vm_page_insert (vm_page_t, struct vm_object *, vm_pindex_t);
513 
514 vm_page_t vm_page_hash_get(vm_object_t object, vm_pindex_t pindex);
515 
516 vm_page_t vm_page_lookup (struct vm_object *, vm_pindex_t);
517 vm_page_t vm_page_lookup_sbusy_try(struct vm_object *object,
518                     vm_pindex_t pindex, int pgoff, int pgbytes);
519 vm_page_t VM_PAGE_DEBUG_EXT(vm_page_lookup_busy_wait)(
520                     struct vm_object *, vm_pindex_t, int, const char *
521                     VM_PAGE_DEBUG_ARGS);
522 vm_page_t VM_PAGE_DEBUG_EXT(vm_page_lookup_busy_try)(
523                     struct vm_object *, vm_pindex_t, int, int *
524                     VM_PAGE_DEBUG_ARGS);
525 void vm_page_remove (vm_page_t);
526 void vm_page_rename (vm_page_t, struct vm_object *, vm_pindex_t);
527 void vm_page_startup (void);
528 void vm_numa_organize(vm_paddr_t ran_beg, vm_paddr_t bytes, int physid);
529 void vm_numa_organize_finalize(void);
530 void vm_page_unwire (vm_page_t, int);
531 void vm_page_wire (vm_page_t);
532 void vm_page_unqueue (vm_page_t);
533 void vm_page_unqueue_nowakeup (vm_page_t);
534 vm_page_t vm_page_next (vm_page_t);
535 void vm_page_set_validclean (vm_page_t, int, int);
536 void vm_page_set_validdirty (vm_page_t, int, int);
537 void vm_page_set_valid (vm_page_t, int, int);
538 void vm_page_set_dirty (vm_page_t, int, int);
539 void vm_page_clear_dirty (vm_page_t, int, int);
540 void vm_page_set_invalid (vm_page_t, int, int);
541 int vm_page_is_valid (vm_page_t, int, int);
542 void vm_page_test_dirty (vm_page_t);
543 int vm_page_bits (int, int);
544 vm_page_t vm_page_list_find(int basequeue, int index);
545 void vm_page_zero_invalid(vm_page_t m, boolean_t setvalid);
546 void vm_page_free_toq(vm_page_t m);
547 void vm_page_free_contig(vm_page_t m, unsigned long size);
548 vm_page_t vm_page_free_fromq_fast(void);
549 void vm_page_dirty(vm_page_t m);
550 void vm_page_sleep_busy(vm_page_t m, int also_m_busy, const char *msg);
551 int vm_page_sbusy_try(vm_page_t m);
552 void VM_PAGE_DEBUG_EXT(vm_page_busy_wait)(vm_page_t m,
553                               int also_m_busy, const char *wmsg VM_PAGE_DEBUG_ARGS);
554 int VM_PAGE_DEBUG_EXT(vm_page_busy_try)(vm_page_t m,
555                               int also_m_busy VM_PAGE_DEBUG_ARGS);
556 u_short vm_get_pg_color(int cpuid, vm_object_t object, vm_pindex_t pindex);
557 
558 #ifdef VM_PAGE_DEBUG
559 
560 #define vm_page_lookup_busy_wait(object, pindex, alsob, msg)                    \
561           vm_page_lookup_busy_wait_debug(object, pindex, alsob, msg,  \
562                                                   __func__, __LINE__)
563 
564 #define vm_page_lookup_busy_try(object, pindex, alsob, errorp)                  \
565           vm_page_lookup_busy_try_debug(object, pindex, alsob, errorp,          \
566                                                   __func__, __LINE__)
567 
568 #define vm_page_busy_wait(m, alsob, msg)                                        \
569           vm_page_busy_wait_debug(m, alsob, msg, __func__, __LINE__)
570 
571 #define vm_page_busy_try(m, alsob)                                              \
572           vm_page_busy_try_debug(m, alsob, __func__, __LINE__)
573 
574 #endif
575 
576 #endif                                  /* _KERNEL */
577 #endif                                  /* !_VM_VM_PAGE_H_ */
578