kernel - Fix DEBUG_LOCKS races
[dragonfly.git] / sys / vm / vm_page.c
1 /*
2  * (MPSAFE)
3  *
4  * Copyright (c) 1991 Regents of the University of California.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to Berkeley by
8  * The Mach Operating System project at Carnegie-Mellon University.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 4. Neither the name of the University nor the names of its contributors
19  *    may be used to endorse or promote products derived from this software
20  *    without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  *
34  *      from: @(#)vm_page.c     7.4 (Berkeley) 5/7/91
35  * $FreeBSD: src/sys/vm/vm_page.c,v 1.147.2.18 2002/03/10 05:03:19 alc Exp $
36  */
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  * Resident memory management module.  The module manipulates 'VM pages'.
66  * A VM page is the core building block for memory management.
67  */
68
69 #include <sys/param.h>
70 #include <sys/systm.h>
71 #include <sys/malloc.h>
72 #include <sys/proc.h>
73 #include <sys/vmmeter.h>
74 #include <sys/vnode.h>
75 #include <sys/kernel.h>
76
77 #include <vm/vm.h>
78 #include <vm/vm_param.h>
79 #include <sys/lock.h>
80 #include <vm/vm_kern.h>
81 #include <vm/pmap.h>
82 #include <vm/vm_map.h>
83 #include <vm/vm_object.h>
84 #include <vm/vm_page.h>
85 #include <vm/vm_pageout.h>
86 #include <vm/vm_pager.h>
87 #include <vm/vm_extern.h>
88 #include <vm/swap_pager.h>
89
90 #include <machine/inttypes.h>
91 #include <machine/md_var.h>
92
93 #include <vm/vm_page2.h>
94 #include <sys/spinlock2.h>
95
96 #define VMACTION_HSIZE  256
97 #define VMACTION_HMASK  (VMACTION_HSIZE - 1)
98
99 static void vm_page_queue_init(void);
100 static void vm_page_free_wakeup(void);
101 static vm_page_t vm_page_select_cache(u_short pg_color);
102 static vm_page_t _vm_page_list_find2(int basequeue, int index);
103 static void _vm_page_deactivate_locked(vm_page_t m, int athead);
104
105 /*
106  * Array of tailq lists
107  */
108 __cachealign struct vpgqueues vm_page_queues[PQ_COUNT];
109
110 LIST_HEAD(vm_page_action_list, vm_page_action);
111 struct vm_page_action_list      action_list[VMACTION_HSIZE];
112 static volatile int vm_pages_waiting;
113
114
115 RB_GENERATE2(vm_page_rb_tree, vm_page, rb_entry, rb_vm_page_compare,
116              vm_pindex_t, pindex);
117
118 static void
119 vm_page_queue_init(void) 
120 {
121         int i;
122
123         for (i = 0; i < PQ_L2_SIZE; i++)
124                 vm_page_queues[PQ_FREE+i].cnt = &vmstats.v_free_count;
125         for (i = 0; i < PQ_L2_SIZE; i++)
126                 vm_page_queues[PQ_CACHE+i].cnt = &vmstats.v_cache_count;
127         for (i = 0; i < PQ_L2_SIZE; i++)
128                 vm_page_queues[PQ_INACTIVE+i].cnt = &vmstats.v_inactive_count;
129         for (i = 0; i < PQ_L2_SIZE; i++)
130                 vm_page_queues[PQ_ACTIVE+i].cnt = &vmstats.v_active_count;
131         for (i = 0; i < PQ_L2_SIZE; i++)
132                 vm_page_queues[PQ_HOLD+i].cnt = &vmstats.v_active_count;
133         /* PQ_NONE has no queue */
134
135         for (i = 0; i < PQ_COUNT; i++) {
136                 TAILQ_INIT(&vm_page_queues[i].pl);
137                 spin_init(&vm_page_queues[i].spin);
138         }
139
140         for (i = 0; i < VMACTION_HSIZE; i++)
141                 LIST_INIT(&action_list[i]);
142 }
143
144 /*
145  * note: place in initialized data section?  Is this necessary?
146  */
147 long first_page = 0;
148 int vm_page_array_size = 0;
149 int vm_page_zero_count = 0;
150 vm_page_t vm_page_array = 0;
151
152 /*
153  * (low level boot)
154  *
155  * Sets the page size, perhaps based upon the memory size.
156  * Must be called before any use of page-size dependent functions.
157  */
158 void
159 vm_set_page_size(void)
160 {
161         if (vmstats.v_page_size == 0)
162                 vmstats.v_page_size = PAGE_SIZE;
163         if (((vmstats.v_page_size - 1) & vmstats.v_page_size) != 0)
164                 panic("vm_set_page_size: page size not a power of two");
165 }
166
167 /*
168  * (low level boot)
169  *
170  * Add a new page to the freelist for use by the system.  New pages
171  * are added to both the head and tail of the associated free page
172  * queue in a bottom-up fashion, so both zero'd and non-zero'd page
173  * requests pull 'recent' adds (higher physical addresses) first.
174  *
175  * Beware that the page zeroing daemon will also be running soon after
176  * boot, moving pages from the head to the tail of the PQ_FREE queues.
177  *
178  * Must be called in a critical section.
179  */
180 static vm_page_t
181 vm_add_new_page(vm_paddr_t pa)
182 {
183         struct vpgqueues *vpq;
184         vm_page_t m;
185
186         m = PHYS_TO_VM_PAGE(pa);
187         m->phys_addr = pa;
188         m->flags = 0;
189         m->pc = (pa >> PAGE_SHIFT) & PQ_L2_MASK;
190 #ifdef SMP
191         /*
192          * Twist for cpu localization in addition to page coloring, so
193          * different cpus selecting by m->queue get different page colors.
194          */
195         m->pc ^= ((pa >> PAGE_SHIFT) / PQ_L2_SIZE) & PQ_L2_MASK;
196         m->pc ^= ((pa >> PAGE_SHIFT) / (PQ_L2_SIZE * PQ_L2_SIZE)) & PQ_L2_MASK;
197 #endif
198         m->queue = m->pc + PQ_FREE;
199         KKASSERT(m->dirty == 0);
200
201         atomic_add_int(&vmstats.v_page_count, 1);
202         atomic_add_int(&vmstats.v_free_count, 1);
203         vpq = &vm_page_queues[m->queue];
204         if ((vpq->flipflop & 15) == 0) {
205                 pmap_zero_page(VM_PAGE_TO_PHYS(m));
206                 m->flags |= PG_ZERO;
207                 TAILQ_INSERT_TAIL(&vpq->pl, m, pageq);
208                 atomic_add_int(&vm_page_zero_count, 1);
209         } else {
210                 TAILQ_INSERT_HEAD(&vpq->pl, m, pageq);
211         }
212         ++vpq->flipflop;
213         ++vpq->lcnt;
214
215         return (m);
216 }
217
218 /*
219  * (low level boot)
220  *
221  * Initializes the resident memory module.
222  *
223  * Preallocates memory for critical VM structures and arrays prior to
224  * kernel_map becoming available.
225  *
226  * Memory is allocated from (virtual2_start, virtual2_end) if available,
227  * otherwise memory is allocated from (virtual_start, virtual_end).
228  *
229  * On x86-64 (virtual_start, virtual_end) is only 2GB and may not be
230  * large enough to hold vm_page_array & other structures for machines with
231  * large amounts of ram, so we want to use virtual2* when available.
232  */
233 void
234 vm_page_startup(void)
235 {
236         vm_offset_t vaddr = virtual2_start ? virtual2_start : virtual_start;
237         vm_offset_t mapped;
238         vm_size_t npages;
239         vm_paddr_t page_range;
240         vm_paddr_t new_end;
241         int i;
242         vm_paddr_t pa;
243         int nblocks;
244         vm_paddr_t last_pa;
245         vm_paddr_t end;
246         vm_paddr_t biggestone, biggestsize;
247         vm_paddr_t total;
248
249         total = 0;
250         biggestsize = 0;
251         biggestone = 0;
252         nblocks = 0;
253         vaddr = round_page(vaddr);
254
255         for (i = 0; phys_avail[i + 1]; i += 2) {
256                 phys_avail[i] = round_page64(phys_avail[i]);
257                 phys_avail[i + 1] = trunc_page64(phys_avail[i + 1]);
258         }
259
260         for (i = 0; phys_avail[i + 1]; i += 2) {
261                 vm_paddr_t size = phys_avail[i + 1] - phys_avail[i];
262
263                 if (size > biggestsize) {
264                         biggestone = i;
265                         biggestsize = size;
266                 }
267                 ++nblocks;
268                 total += size;
269         }
270
271         end = phys_avail[biggestone+1];
272         end = trunc_page(end);
273
274         /*
275          * Initialize the queue headers for the free queue, the active queue
276          * and the inactive queue.
277          */
278
279         vm_page_queue_init();
280
281 #if !defined(_KERNEL_VIRTUAL)
282         /*
283          * VKERNELs don't support minidumps and as such don't need
284          * vm_page_dump
285          *
286          * Allocate a bitmap to indicate that a random physical page
287          * needs to be included in a minidump.
288          *
289          * The amd64 port needs this to indicate which direct map pages
290          * need to be dumped, via calls to dump_add_page()/dump_drop_page().
291          *
292          * However, i386 still needs this workspace internally within the
293          * minidump code.  In theory, they are not needed on i386, but are
294          * included should the sf_buf code decide to use them.
295          */
296         page_range = phys_avail[(nblocks - 1) * 2 + 1] / PAGE_SIZE;
297         vm_page_dump_size = round_page(roundup2(page_range, NBBY) / NBBY);
298         end -= vm_page_dump_size;
299         vm_page_dump = (void *)pmap_map(&vaddr, end, end + vm_page_dump_size,
300             VM_PROT_READ | VM_PROT_WRITE);
301         bzero((void *)vm_page_dump, vm_page_dump_size);
302 #endif
303
304         /*
305          * Compute the number of pages of memory that will be available for
306          * use (taking into account the overhead of a page structure per
307          * page).
308          */
309         first_page = phys_avail[0] / PAGE_SIZE;
310         page_range = phys_avail[(nblocks - 1) * 2 + 1] / PAGE_SIZE - first_page;
311         npages = (total - (page_range * sizeof(struct vm_page))) / PAGE_SIZE;
312
313         /*
314          * Initialize the mem entry structures now, and put them in the free
315          * queue.
316          */
317         new_end = trunc_page(end - page_range * sizeof(struct vm_page));
318         mapped = pmap_map(&vaddr, new_end, end,
319             VM_PROT_READ | VM_PROT_WRITE);
320         vm_page_array = (vm_page_t)mapped;
321
322 #if defined(__x86_64__) && !defined(_KERNEL_VIRTUAL)
323         /*
324          * since pmap_map on amd64 returns stuff out of a direct-map region,
325          * we have to manually add these pages to the minidump tracking so
326          * that they can be dumped, including the vm_page_array.
327          */
328         for (pa = new_end; pa < phys_avail[biggestone + 1]; pa += PAGE_SIZE)
329                 dump_add_page(pa);
330 #endif
331
332         /*
333          * Clear all of the page structures
334          */
335         bzero((caddr_t) vm_page_array, page_range * sizeof(struct vm_page));
336         vm_page_array_size = page_range;
337
338         /*
339          * Construct the free queue(s) in ascending order (by physical
340          * address) so that the first 16MB of physical memory is allocated
341          * last rather than first.  On large-memory machines, this avoids
342          * the exhaustion of low physical memory before isa_dmainit has run.
343          */
344         vmstats.v_page_count = 0;
345         vmstats.v_free_count = 0;
346         for (i = 0; phys_avail[i + 1] && npages > 0; i += 2) {
347                 pa = phys_avail[i];
348                 if (i == biggestone)
349                         last_pa = new_end;
350                 else
351                         last_pa = phys_avail[i + 1];
352                 while (pa < last_pa && npages-- > 0) {
353                         vm_add_new_page(pa);
354                         pa += PAGE_SIZE;
355                 }
356         }
357         if (virtual2_start)
358                 virtual2_start = vaddr;
359         else
360                 virtual_start = vaddr;
361 }
362
363 /*
364  * Scan comparison function for Red-Black tree scans.  An inclusive
365  * (start,end) is expected.  Other fields are not used.
366  */
367 int
368 rb_vm_page_scancmp(struct vm_page *p, void *data)
369 {
370         struct rb_vm_page_scan_info *info = data;
371
372         if (p->pindex < info->start_pindex)
373                 return(-1);
374         if (p->pindex > info->end_pindex)
375                 return(1);
376         return(0);
377 }
378
379 int
380 rb_vm_page_compare(struct vm_page *p1, struct vm_page *p2)
381 {
382         if (p1->pindex < p2->pindex)
383                 return(-1);
384         if (p1->pindex > p2->pindex)
385                 return(1);
386         return(0);
387 }
388
389 /*
390  * Each page queue has its own spin lock, which is fairly optimal for
391  * allocating and freeing pages at least.
392  *
393  * The caller must hold the vm_page_spin_lock() before locking a vm_page's
394  * queue spinlock via this function.  Also note that m->queue cannot change
395  * unless both the page and queue are locked.
396  */
397 static __inline
398 void
399 _vm_page_queue_spin_lock(vm_page_t m)
400 {
401         u_short queue;
402
403         queue = m->queue;
404         if (queue != PQ_NONE) {
405                 spin_lock(&vm_page_queues[queue].spin);
406                 KKASSERT(queue == m->queue);
407         }
408 }
409
410 static __inline
411 void
412 _vm_page_queue_spin_unlock(vm_page_t m)
413 {
414         u_short queue;
415
416         queue = m->queue;
417         cpu_ccfence();
418         if (queue != PQ_NONE)
419                 spin_unlock(&vm_page_queues[queue].spin);
420 }
421
422 static __inline
423 void
424 _vm_page_queues_spin_lock(u_short queue)
425 {
426         cpu_ccfence();
427         if (queue != PQ_NONE)
428                 spin_lock(&vm_page_queues[queue].spin);
429 }
430
431
432 static __inline
433 void
434 _vm_page_queues_spin_unlock(u_short queue)
435 {
436         cpu_ccfence();
437         if (queue != PQ_NONE)
438                 spin_unlock(&vm_page_queues[queue].spin);
439 }
440
441 void
442 vm_page_queue_spin_lock(vm_page_t m)
443 {
444         _vm_page_queue_spin_lock(m);
445 }
446
447 void
448 vm_page_queues_spin_lock(u_short queue)
449 {
450         _vm_page_queues_spin_lock(queue);
451 }
452
453 void
454 vm_page_queue_spin_unlock(vm_page_t m)
455 {
456         _vm_page_queue_spin_unlock(m);
457 }
458
459 void
460 vm_page_queues_spin_unlock(u_short queue)
461 {
462         _vm_page_queues_spin_unlock(queue);
463 }
464
465 /*
466  * This locks the specified vm_page and its queue in the proper order
467  * (page first, then queue).  The queue may change so the caller must
468  * recheck on return.
469  */
470 static __inline
471 void
472 _vm_page_and_queue_spin_lock(vm_page_t m)
473 {
474         vm_page_spin_lock(m);
475         _vm_page_queue_spin_lock(m);
476 }
477
478 static __inline
479 void
480 _vm_page_and_queue_spin_unlock(vm_page_t m)
481 {
482         _vm_page_queues_spin_unlock(m->queue);
483         vm_page_spin_unlock(m);
484 }
485
486 void
487 vm_page_and_queue_spin_unlock(vm_page_t m)
488 {
489         _vm_page_and_queue_spin_unlock(m);
490 }
491
492 void
493 vm_page_and_queue_spin_lock(vm_page_t m)
494 {
495         _vm_page_and_queue_spin_lock(m);
496 }
497
498 /*
499  * Helper function removes vm_page from its current queue.
500  * Returns the base queue the page used to be on.
501  *
502  * The vm_page and the queue must be spinlocked.
503  * This function will unlock the queue but leave the page spinlocked.
504  */
505 static __inline u_short
506 _vm_page_rem_queue_spinlocked(vm_page_t m)
507 {
508         struct vpgqueues *pq;
509         u_short queue;
510
511         queue = m->queue;
512         if (queue != PQ_NONE) {
513                 pq = &vm_page_queues[queue];
514                 TAILQ_REMOVE(&pq->pl, m, pageq);
515                 atomic_add_int(pq->cnt, -1);
516                 pq->lcnt--;
517                 m->queue = PQ_NONE;
518                 vm_page_queues_spin_unlock(queue);
519                 if ((queue - m->pc) == PQ_FREE && (m->flags & PG_ZERO))
520                         atomic_subtract_int(&vm_page_zero_count, 1);
521                 if ((queue - m->pc) == PQ_CACHE || (queue - m->pc) == PQ_FREE)
522                         return (queue - m->pc);
523         }
524         return queue;
525 }
526
527 /*
528  * Helper function places the vm_page on the specified queue.
529  *
530  * The vm_page must be spinlocked.
531  * This function will return with both the page and the queue locked.
532  */
533 static __inline void
534 _vm_page_add_queue_spinlocked(vm_page_t m, u_short queue, int athead)
535 {
536         struct vpgqueues *pq;
537
538         KKASSERT(m->queue == PQ_NONE);
539
540         if (queue != PQ_NONE) {
541                 vm_page_queues_spin_lock(queue);
542                 pq = &vm_page_queues[queue];
543                 ++pq->lcnt;
544                 atomic_add_int(pq->cnt, 1);
545                 m->queue = queue;
546
547                 /*
548                  * Put zero'd pages on the end ( where we look for zero'd pages
549                  * first ) and non-zerod pages at the head.
550                  */
551                 if (queue - m->pc == PQ_FREE) {
552                         if (m->flags & PG_ZERO) {
553                                 TAILQ_INSERT_TAIL(&pq->pl, m, pageq);
554                                 atomic_add_int(&vm_page_zero_count, 1);
555                         } else {
556                                 TAILQ_INSERT_HEAD(&pq->pl, m, pageq);
557                         }
558                 } else if (athead) {
559                         TAILQ_INSERT_HEAD(&pq->pl, m, pageq);
560                 } else {
561                         TAILQ_INSERT_TAIL(&pq->pl, m, pageq);
562                 }
563                 /* leave the queue spinlocked */
564         }
565 }
566
567 /*
568  * Wait until page is no longer PG_BUSY or (if also_m_busy is TRUE)
569  * m->busy is zero.  Returns TRUE if it had to sleep, FALSE if we
570  * did not.  Only one sleep call will be made before returning.
571  *
572  * This function does NOT busy the page and on return the page is not
573  * guaranteed to be available.
574  */
575 void
576 vm_page_sleep_busy(vm_page_t m, int also_m_busy, const char *msg)
577 {
578         u_int32_t flags;
579
580         for (;;) {
581                 flags = m->flags;
582                 cpu_ccfence();
583
584                 if ((flags & PG_BUSY) == 0 &&
585                     (also_m_busy == 0 || (flags & PG_SBUSY) == 0)) {
586                         break;
587                 }
588                 tsleep_interlock(m, 0);
589                 if (atomic_cmpset_int(&m->flags, flags,
590                                       flags | PG_WANTED | PG_REFERENCED)) {
591                         tsleep(m, PINTERLOCKED, msg, 0);
592                         break;
593                 }
594         }
595 }
596
597 /*
598  * Wait until PG_BUSY can be set, then set it.  If also_m_busy is TRUE we
599  * also wait for m->busy to become 0 before setting PG_BUSY.
600  */
601 void
602 VM_PAGE_DEBUG_EXT(vm_page_busy_wait)(vm_page_t m,
603                                      int also_m_busy, const char *msg
604                                      VM_PAGE_DEBUG_ARGS)
605 {
606         u_int32_t flags;
607
608         for (;;) {
609                 flags = m->flags;
610                 cpu_ccfence();
611                 if (flags & PG_BUSY) {
612                         tsleep_interlock(m, 0);
613                         if (atomic_cmpset_int(&m->flags, flags,
614                                           flags | PG_WANTED | PG_REFERENCED)) {
615                                 tsleep(m, PINTERLOCKED, msg, 0);
616                         }
617                 } else if (also_m_busy && (flags & PG_SBUSY)) {
618                         tsleep_interlock(m, 0);
619                         if (atomic_cmpset_int(&m->flags, flags,
620                                           flags | PG_WANTED | PG_REFERENCED)) {
621                                 tsleep(m, PINTERLOCKED, msg, 0);
622                         }
623                 } else {
624                         if (atomic_cmpset_int(&m->flags, flags,
625                                               flags | PG_BUSY)) {
626 #ifdef VM_PAGE_DEBUG
627                                 m->busy_func = func;
628                                 m->busy_line = lineno;
629 #endif
630                                 break;
631                         }
632                 }
633         }
634 }
635
636 /*
637  * Attempt to set PG_BUSY.  If also_m_busy is TRUE we only succeed if m->busy
638  * is also 0.
639  *
640  * Returns non-zero on failure.
641  */
642 int
643 VM_PAGE_DEBUG_EXT(vm_page_busy_try)(vm_page_t m, int also_m_busy
644                                     VM_PAGE_DEBUG_ARGS)
645 {
646         u_int32_t flags;
647
648         for (;;) {
649                 flags = m->flags;
650                 cpu_ccfence();
651                 if (flags & PG_BUSY)
652                         return TRUE;
653                 if (also_m_busy && (flags & PG_SBUSY))
654                         return TRUE;
655                 if (atomic_cmpset_int(&m->flags, flags, flags | PG_BUSY)) {
656 #ifdef VM_PAGE_DEBUG
657                                 m->busy_func = func;
658                                 m->busy_line = lineno;
659 #endif
660                         return FALSE;
661                 }
662         }
663 }
664
665 /*
666  * Clear the PG_BUSY flag and return non-zero to indicate to the caller
667  * that a wakeup() should be performed.
668  *
669  * The vm_page must be spinlocked and will remain spinlocked on return.
670  * The related queue must NOT be spinlocked (which could deadlock us).
671  *
672  * (inline version)
673  */
674 static __inline
675 int
676 _vm_page_wakeup(vm_page_t m)
677 {
678         u_int32_t flags;
679
680         for (;;) {
681                 flags = m->flags;
682                 cpu_ccfence();
683                 if (atomic_cmpset_int(&m->flags, flags,
684                                       flags & ~(PG_BUSY | PG_WANTED))) {
685                         break;
686                 }
687         }
688         return(flags & PG_WANTED);
689 }
690
691 /*
692  * Clear the PG_BUSY flag and wakeup anyone waiting for the page.  This
693  * is typically the last call you make on a page before moving onto
694  * other things.
695  */
696 void
697 vm_page_wakeup(vm_page_t m)
698 {
699         KASSERT(m->flags & PG_BUSY, ("vm_page_wakeup: page not busy!!!"));
700         vm_page_spin_lock(m);
701         if (_vm_page_wakeup(m)) {
702                 vm_page_spin_unlock(m);
703                 wakeup(m);
704         } else {
705                 vm_page_spin_unlock(m);
706         }
707 }
708
709 /*
710  * Holding a page keeps it from being reused.  Other parts of the system
711  * can still disassociate the page from its current object and free it, or
712  * perform read or write I/O on it and/or otherwise manipulate the page,
713  * but if the page is held the VM system will leave the page and its data
714  * intact and not reuse the page for other purposes until the last hold
715  * reference is released.  (see vm_page_wire() if you want to prevent the
716  * page from being disassociated from its object too).
717  *
718  * The caller must still validate the contents of the page and, if necessary,
719  * wait for any pending I/O (e.g. vm_page_sleep_busy() loop) to complete
720  * before manipulating the page.
721  *
722  * XXX get vm_page_spin_lock() here and move FREE->HOLD if necessary
723  */
724 void
725 vm_page_hold(vm_page_t m)
726 {
727         vm_page_spin_lock(m);
728         atomic_add_int(&m->hold_count, 1);
729         if (m->queue - m->pc == PQ_FREE) {
730                 _vm_page_queue_spin_lock(m);
731                 _vm_page_rem_queue_spinlocked(m);
732                 _vm_page_add_queue_spinlocked(m, PQ_HOLD + m->pc, 0);
733                 _vm_page_queue_spin_unlock(m);
734         }
735         vm_page_spin_unlock(m);
736 }
737
738 /*
739  * The opposite of vm_page_hold().  A page can be freed while being held,
740  * which places it on the PQ_HOLD queue.  If we are able to busy the page
741  * after the hold count drops to zero we will move the page to the
742  * appropriate PQ_FREE queue by calling vm_page_free_toq().
743  */
744 void
745 vm_page_unhold(vm_page_t m)
746 {
747         vm_page_spin_lock(m);
748         atomic_add_int(&m->hold_count, -1);
749         if (m->hold_count == 0 && m->queue - m->pc == PQ_HOLD) {
750                 _vm_page_queue_spin_lock(m);
751                 _vm_page_rem_queue_spinlocked(m);
752                 _vm_page_add_queue_spinlocked(m, PQ_FREE + m->pc, 0);
753                 _vm_page_queue_spin_unlock(m);
754         }
755         vm_page_spin_unlock(m);
756 }
757
758 /*
759  * Inserts the given vm_page into the object and object list.
760  *
761  * The pagetables are not updated but will presumably fault the page
762  * in if necessary, or if a kernel page the caller will at some point
763  * enter the page into the kernel's pmap.  We are not allowed to block
764  * here so we *can't* do this anyway.
765  *
766  * This routine may not block.
767  * This routine must be called with the vm_object held.
768  * This routine must be called with a critical section held.
769  *
770  * This routine returns TRUE if the page was inserted into the object
771  * successfully, and FALSE if the page already exists in the object.
772  */
773 int
774 vm_page_insert(vm_page_t m, vm_object_t object, vm_pindex_t pindex)
775 {
776         ASSERT_LWKT_TOKEN_HELD(vm_object_token(object));
777         if (m->object != NULL)
778                 panic("vm_page_insert: already inserted");
779
780         object->generation++;
781
782         /*
783          * Record the object/offset pair in this page and add the
784          * pv_list_count of the page to the object.
785          *
786          * The vm_page spin lock is required for interactions with the pmap.
787          */
788         vm_page_spin_lock(m);
789         m->object = object;
790         m->pindex = pindex;
791         if (vm_page_rb_tree_RB_INSERT(&object->rb_memq, m)) {
792                 m->object = NULL;
793                 m->pindex = 0;
794                 vm_page_spin_unlock(m);
795                 return FALSE;
796         }
797         object->resident_page_count++;
798         /* atomic_add_int(&object->agg_pv_list_count, m->md.pv_list_count); */
799         vm_page_spin_unlock(m);
800
801         /*
802          * Since we are inserting a new and possibly dirty page,
803          * update the object's OBJ_WRITEABLE and OBJ_MIGHTBEDIRTY flags.
804          */
805         if ((m->valid & m->dirty) || (m->flags & PG_WRITEABLE))
806                 vm_object_set_writeable_dirty(object);
807
808         /*
809          * Checks for a swap assignment and sets PG_SWAPPED if appropriate.
810          */
811         swap_pager_page_inserted(m);
812         return TRUE;
813 }
814
815 /*
816  * Removes the given vm_page_t from the (object,index) table
817  *
818  * The underlying pmap entry (if any) is NOT removed here.
819  * This routine may not block.
820  *
821  * The page must be BUSY and will remain BUSY on return.
822  * No other requirements.
823  *
824  * NOTE: FreeBSD side effect was to unbusy the page on return.  We leave
825  *       it busy.
826  */
827 void
828 vm_page_remove(vm_page_t m)
829 {
830         vm_object_t object;
831
832         if (m->object == NULL) {
833                 return;
834         }
835
836         if ((m->flags & PG_BUSY) == 0)
837                 panic("vm_page_remove: page not busy");
838
839         object = m->object;
840
841         vm_object_hold(object);
842
843         /*
844          * Remove the page from the object and update the object.
845          *
846          * The vm_page spin lock is required for interactions with the pmap.
847          */
848         vm_page_spin_lock(m);
849         vm_page_rb_tree_RB_REMOVE(&object->rb_memq, m);
850         object->resident_page_count--;
851         /* atomic_add_int(&object->agg_pv_list_count, -m->md.pv_list_count); */
852         m->object = NULL;
853         vm_page_spin_unlock(m);
854
855         object->generation++;
856
857         vm_object_drop(object);
858 }
859
860 /*
861  * Locate and return the page at (object, pindex), or NULL if the
862  * page could not be found.
863  *
864  * The caller must hold the vm_object token.
865  */
866 vm_page_t
867 vm_page_lookup(vm_object_t object, vm_pindex_t pindex)
868 {
869         vm_page_t m;
870
871         /*
872          * Search the hash table for this object/offset pair
873          */
874         ASSERT_LWKT_TOKEN_HELD(vm_object_token(object));
875         m = vm_page_rb_tree_RB_LOOKUP(&object->rb_memq, pindex);
876         KKASSERT(m == NULL || (m->object == object && m->pindex == pindex));
877         return(m);
878 }
879
880 vm_page_t
881 VM_PAGE_DEBUG_EXT(vm_page_lookup_busy_wait)(struct vm_object *object,
882                                             vm_pindex_t pindex,
883                                             int also_m_busy, const char *msg
884                                             VM_PAGE_DEBUG_ARGS)
885 {
886         u_int32_t flags;
887         vm_page_t m;
888
889         ASSERT_LWKT_TOKEN_HELD(vm_object_token(object));
890         m = vm_page_rb_tree_RB_LOOKUP(&object->rb_memq, pindex);
891         while (m) {
892                 KKASSERT(m->object == object && m->pindex == pindex);
893                 flags = m->flags;
894                 cpu_ccfence();
895                 if (flags & PG_BUSY) {
896                         tsleep_interlock(m, 0);
897                         if (atomic_cmpset_int(&m->flags, flags,
898                                           flags | PG_WANTED | PG_REFERENCED)) {
899                                 tsleep(m, PINTERLOCKED, msg, 0);
900                                 m = vm_page_rb_tree_RB_LOOKUP(&object->rb_memq,
901                                                               pindex);
902                         }
903                 } else if (also_m_busy && (flags & PG_SBUSY)) {
904                         tsleep_interlock(m, 0);
905                         if (atomic_cmpset_int(&m->flags, flags,
906                                           flags | PG_WANTED | PG_REFERENCED)) {
907                                 tsleep(m, PINTERLOCKED, msg, 0);
908                                 m = vm_page_rb_tree_RB_LOOKUP(&object->rb_memq,
909                                                               pindex);
910                         }
911                 } else if (atomic_cmpset_int(&m->flags, flags,
912                                              flags | PG_BUSY)) {
913 #ifdef VM_PAGE_DEBUG
914                         m->busy_func = func;
915                         m->busy_line = lineno;
916 #endif
917                         break;
918                 }
919         }
920         return m;
921 }
922
923 /*
924  * Attempt to lookup and busy a page.
925  *
926  * Returns NULL if the page could not be found
927  *
928  * Returns a vm_page and error == TRUE if the page exists but could not
929  * be busied.
930  *
931  * Returns a vm_page and error == FALSE on success.
932  */
933 vm_page_t
934 VM_PAGE_DEBUG_EXT(vm_page_lookup_busy_try)(struct vm_object *object,
935                                            vm_pindex_t pindex,
936                                            int also_m_busy, int *errorp
937                                            VM_PAGE_DEBUG_ARGS)
938 {
939         u_int32_t flags;
940         vm_page_t m;
941
942         ASSERT_LWKT_TOKEN_HELD(vm_object_token(object));
943         m = vm_page_rb_tree_RB_LOOKUP(&object->rb_memq, pindex);
944         *errorp = FALSE;
945         while (m) {
946                 KKASSERT(m->object == object && m->pindex == pindex);
947                 flags = m->flags;
948                 cpu_ccfence();
949                 if (flags & PG_BUSY) {
950                         *errorp = TRUE;
951                         break;
952                 }
953                 if (also_m_busy && (flags & PG_SBUSY)) {
954                         *errorp = TRUE;
955                         break;
956                 }
957                 if (atomic_cmpset_int(&m->flags, flags, flags | PG_BUSY)) {
958 #ifdef VM_PAGE_DEBUG
959                         m->busy_func = func;
960                         m->busy_line = lineno;
961 #endif
962                         break;
963                 }
964         }
965         return m;
966 }
967
968 /*
969  * Caller must hold the related vm_object
970  */
971 vm_page_t
972 vm_page_next(vm_page_t m)
973 {
974         vm_page_t next;
975
976         next = vm_page_rb_tree_RB_NEXT(m);
977         if (next && next->pindex != m->pindex + 1)
978                 next = NULL;
979         return (next);
980 }
981
982 /*
983  * vm_page_rename()
984  *
985  * Move the given vm_page from its current object to the specified
986  * target object/offset.  The page must be busy and will remain so
987  * on return.
988  *
989  * new_object must be held.
990  * This routine might block. XXX ?
991  *
992  * NOTE: Swap associated with the page must be invalidated by the move.  We
993  *       have to do this for several reasons:  (1) we aren't freeing the
994  *       page, (2) we are dirtying the page, (3) the VM system is probably
995  *       moving the page from object A to B, and will then later move
996  *       the backing store from A to B and we can't have a conflict.
997  *
998  * NOTE: We *always* dirty the page.  It is necessary both for the
999  *       fact that we moved it, and because we may be invalidating
1000  *       swap.  If the page is on the cache, we have to deactivate it
1001  *       or vm_page_dirty() will panic.  Dirty pages are not allowed
1002  *       on the cache.
1003  */
1004 void
1005 vm_page_rename(vm_page_t m, vm_object_t new_object, vm_pindex_t new_pindex)
1006 {
1007         KKASSERT(m->flags & PG_BUSY);
1008         ASSERT_LWKT_TOKEN_HELD(vm_object_token(new_object));
1009         if (m->object) {
1010                 ASSERT_LWKT_TOKEN_HELD(vm_object_token(m->object));
1011                 vm_page_remove(m);
1012         }
1013         if (vm_page_insert(m, new_object, new_pindex) == FALSE) {
1014                 panic("vm_page_rename: target exists (%p,%"PRIu64")",
1015                       new_object, new_pindex);
1016         }
1017         if (m->queue - m->pc == PQ_CACHE)
1018                 vm_page_deactivate(m);
1019         vm_page_dirty(m);
1020 }
1021
1022 /*
1023  * vm_page_unqueue() without any wakeup.  This routine is used when a page
1024  * is being moved between queues or otherwise is to remain BUSYied by the
1025  * caller.
1026  *
1027  * This routine may not block.
1028  */
1029 void
1030 vm_page_unqueue_nowakeup(vm_page_t m)
1031 {
1032         vm_page_and_queue_spin_lock(m);
1033         (void)_vm_page_rem_queue_spinlocked(m);
1034         vm_page_spin_unlock(m);
1035 }
1036
1037 /*
1038  * vm_page_unqueue() - Remove a page from its queue, wakeup the pagedemon
1039  * if necessary.
1040  *
1041  * This routine may not block.
1042  */
1043 void
1044 vm_page_unqueue(vm_page_t m)
1045 {
1046         u_short queue;
1047
1048         vm_page_and_queue_spin_lock(m);
1049         queue = _vm_page_rem_queue_spinlocked(m);
1050         if (queue == PQ_FREE || queue == PQ_CACHE) {
1051                 vm_page_spin_unlock(m);
1052                 pagedaemon_wakeup();
1053         } else {
1054                 vm_page_spin_unlock(m);
1055         }
1056 }
1057
1058 /*
1059  * vm_page_list_find()
1060  *
1061  * Find a page on the specified queue with color optimization.
1062  *
1063  * The page coloring optimization attempts to locate a page that does
1064  * not overload other nearby pages in the object in the cpu's L1 or L2
1065  * caches.  We need this optimization because cpu caches tend to be
1066  * physical caches, while object spaces tend to be virtual.
1067  *
1068  * On MP systems each PQ_FREE and PQ_CACHE color queue has its own spinlock
1069  * and the algorithm is adjusted to localize allocations on a per-core basis.
1070  * This is done by 'twisting' the colors.
1071  *
1072  * The page is returned spinlocked and removed from its queue (it will
1073  * be on PQ_NONE), or NULL. The page is not PG_BUSY'd.  The caller
1074  * is responsible for dealing with the busy-page case (usually by
1075  * deactivating the page and looping).
1076  *
1077  * NOTE:  This routine is carefully inlined.  A non-inlined version
1078  *        is available for outside callers but the only critical path is
1079  *        from within this source file.
1080  *
1081  * NOTE:  This routine assumes that the vm_pages found in PQ_CACHE and PQ_FREE
1082  *        represent stable storage, allowing us to order our locks vm_page
1083  *        first, then queue.
1084  */
1085 static __inline
1086 vm_page_t
1087 _vm_page_list_find(int basequeue, int index, boolean_t prefer_zero)
1088 {
1089         vm_page_t m;
1090
1091         for (;;) {
1092                 if (prefer_zero)
1093                         m = TAILQ_LAST(&vm_page_queues[basequeue+index].pl, pglist);
1094                 else
1095                         m = TAILQ_FIRST(&vm_page_queues[basequeue+index].pl);
1096                 if (m == NULL) {
1097                         m = _vm_page_list_find2(basequeue, index);
1098                         return(m);
1099                 }
1100                 vm_page_and_queue_spin_lock(m);
1101                 if (m->queue == basequeue + index) {
1102                         _vm_page_rem_queue_spinlocked(m);
1103                         /* vm_page_t spin held, no queue spin */
1104                         break;
1105                 }
1106                 vm_page_and_queue_spin_unlock(m);
1107         }
1108         return(m);
1109 }
1110
1111 static vm_page_t
1112 _vm_page_list_find2(int basequeue, int index)
1113 {
1114         int i;
1115         vm_page_t m = NULL;
1116         struct vpgqueues *pq;
1117
1118         pq = &vm_page_queues[basequeue];
1119
1120         /*
1121          * Note that for the first loop, index+i and index-i wind up at the
1122          * same place.  Even though this is not totally optimal, we've already
1123          * blown it by missing the cache case so we do not care.
1124          */
1125         for (i = PQ_L2_SIZE / 2; i > 0; --i) {
1126                 for (;;) {
1127                         m = TAILQ_FIRST(&pq[(index + i) & PQ_L2_MASK].pl);
1128                         if (m) {
1129                                 _vm_page_and_queue_spin_lock(m);
1130                                 if (m->queue ==
1131                                     basequeue + ((index + i) & PQ_L2_MASK)) {
1132                                         _vm_page_rem_queue_spinlocked(m);
1133                                         return(m);
1134                                 }
1135                                 _vm_page_and_queue_spin_unlock(m);
1136                                 continue;
1137                         }
1138                         m = TAILQ_FIRST(&pq[(index - i) & PQ_L2_MASK].pl);
1139                         if (m) {
1140                                 _vm_page_and_queue_spin_lock(m);
1141                                 if (m->queue ==
1142                                     basequeue + ((index - i) & PQ_L2_MASK)) {
1143                                         _vm_page_rem_queue_spinlocked(m);
1144                                         return(m);
1145                                 }
1146                                 _vm_page_and_queue_spin_unlock(m);
1147                                 continue;
1148                         }
1149                         break;  /* next i */
1150                 }
1151         }
1152         return(m);
1153 }
1154
1155 /*
1156  * Returns a vm_page candidate for allocation.  The page is not busied so
1157  * it can move around.  The caller must busy the page (and typically
1158  * deactivate it if it cannot be busied!)
1159  *
1160  * Returns a spinlocked vm_page that has been removed from its queue.
1161  */
1162 vm_page_t
1163 vm_page_list_find(int basequeue, int index, boolean_t prefer_zero)
1164 {
1165         return(_vm_page_list_find(basequeue, index, prefer_zero));
1166 }
1167
1168 /*
1169  * Find a page on the cache queue with color optimization, remove it
1170  * from the queue, and busy it.  The returned page will not be spinlocked.
1171  *
1172  * A candidate failure will be deactivated.  Candidates can fail due to
1173  * being busied by someone else, in which case they will be deactivated.
1174  *
1175  * This routine may not block.
1176  *
1177  */
1178 static vm_page_t
1179 vm_page_select_cache(u_short pg_color)
1180 {
1181         vm_page_t m;
1182
1183         for (;;) {
1184                 m = _vm_page_list_find(PQ_CACHE, pg_color & PQ_L2_MASK, FALSE);
1185                 if (m == NULL)
1186                         break;
1187                 /*
1188                  * (m) has been removed from its queue and spinlocked
1189                  */
1190                 if (vm_page_busy_try(m, TRUE)) {
1191                         _vm_page_deactivate_locked(m, 0);
1192                         vm_page_spin_unlock(m);
1193 #ifdef INVARIANTS
1194                         kprintf("Warning: busy page %p found in cache\n", m);
1195 #endif
1196                 } else {
1197                         /*
1198                          * We successfully busied the page
1199                          */
1200                         if ((m->flags & PG_UNMANAGED) == 0 &&
1201                             m->hold_count == 0 &&
1202                             m->wire_count == 0) {
1203                                 vm_page_spin_unlock(m);
1204                                 pagedaemon_wakeup();
1205                                 return(m);
1206                         }
1207                         _vm_page_deactivate_locked(m, 0);
1208                         if (_vm_page_wakeup(m)) {
1209                                 vm_page_spin_unlock(m);
1210                                 wakeup(m);
1211                         } else {
1212                                 vm_page_spin_unlock(m);
1213                         }
1214                 }
1215         }
1216         return (m);
1217 }
1218
1219 /*
1220  * Find a free or zero page, with specified preference.  We attempt to
1221  * inline the nominal case and fall back to _vm_page_select_free() 
1222  * otherwise.  A busied page is removed from the queue and returned.
1223  *
1224  * This routine may not block.
1225  */
1226 static __inline vm_page_t
1227 vm_page_select_free(u_short pg_color, boolean_t prefer_zero)
1228 {
1229         vm_page_t m;
1230
1231         for (;;) {
1232                 m = _vm_page_list_find(PQ_FREE, pg_color & PQ_L2_MASK,
1233                                        prefer_zero);
1234                 if (m == NULL)
1235                         break;
1236                 if (vm_page_busy_try(m, TRUE)) {
1237                         /*
1238                          * Various mechanisms such as a pmap_collect can
1239                          * result in a busy page on the free queue.  We
1240                          * have to move the page out of the way so we can
1241                          * retry the allocation.  If the other thread is not
1242                          * allocating the page then m->valid will remain 0 and
1243                          * the pageout daemon will free the page later on.
1244                          *
1245                          * Since we could not busy the page, however, we
1246                          * cannot make assumptions as to whether the page
1247                          * will be allocated by the other thread or not,
1248                          * so all we can do is deactivate it to move it out
1249                          * of the way.  In particular, if the other thread
1250                          * wires the page it may wind up on the inactive
1251                          * queue and the pageout daemon will have to deal
1252                          * with that case too.
1253                          */
1254                         _vm_page_deactivate_locked(m, 0);
1255                         vm_page_spin_unlock(m);
1256 #ifdef INVARIANTS
1257                         kprintf("Warning: busy page %p found in cache\n", m);
1258 #endif
1259                 } else {
1260                         /*
1261                          * Theoretically if we are able to busy the page
1262                          * atomic with the queue removal (using the vm_page
1263                          * lock) nobody else should be able to mess with the
1264                          * page before us.
1265                          */
1266                         KKASSERT((m->flags & PG_UNMANAGED) == 0);
1267                         KKASSERT(m->hold_count == 0);
1268                         KKASSERT(m->wire_count == 0);
1269                         vm_page_spin_unlock(m);
1270                         pagedaemon_wakeup();
1271
1272                         /* return busied and removed page */
1273                         return(m);
1274                 }
1275         }
1276         return(m);
1277 }
1278
1279 /*
1280  * This implements a per-cpu cache of free, zero'd, ready-to-go pages.
1281  * The idea is to populate this cache prior to acquiring any locks so
1282  * we don't wind up potentially zeroing VM pages (under heavy loads) while
1283  * holding potentialy contending locks.
1284  *
1285  * Note that we allocate the page uninserted into anything and use a pindex
1286  * of 0, the vm_page_alloc() will effectively add gd_cpuid so these
1287  * allocations should wind up being uncontended.  However, we still want
1288  * to rove across PQ_L2_SIZE.
1289  */
1290 void
1291 vm_page_pcpu_cache(void)
1292 {
1293 #if 0
1294         globaldata_t gd = mycpu;
1295         vm_page_t m;
1296
1297         if (gd->gd_vmpg_count < GD_MINVMPG) {
1298                 crit_enter_gd(gd);
1299                 while (gd->gd_vmpg_count < GD_MAXVMPG) {
1300                         m = vm_page_alloc(NULL, ticks & ~ncpus2_mask,
1301                                           VM_ALLOC_NULL_OK | VM_ALLOC_NORMAL |
1302                                           VM_ALLOC_NULL_OK | VM_ALLOC_ZERO);
1303                         if (gd->gd_vmpg_count < GD_MAXVMPG) {
1304                                 if ((m->flags & PG_ZERO) == 0) {
1305                                         pmap_zero_page(VM_PAGE_TO_PHYS(m));
1306                                         vm_page_flag_set(m, PG_ZERO);
1307                                 }
1308                                 gd->gd_vmpg_array[gd->gd_vmpg_count++] = m;
1309                         } else {
1310                                 vm_page_free(m);
1311                         }
1312                 }
1313                 crit_exit_gd(gd);
1314         }
1315 #endif
1316 }
1317
1318 /*
1319  * vm_page_alloc()
1320  *
1321  * Allocate and return a memory cell associated with this VM object/offset
1322  * pair.  If object is NULL an unassociated page will be allocated.
1323  *
1324  * The returned page will be busied and removed from its queues.  This
1325  * routine can block and may return NULL if a race occurs and the page
1326  * is found to already exist at the specified (object, pindex).
1327  *
1328  *      VM_ALLOC_NORMAL         allow use of cache pages, nominal free drain
1329  *      VM_ALLOC_QUICK          like normal but cannot use cache
1330  *      VM_ALLOC_SYSTEM         greater free drain
1331  *      VM_ALLOC_INTERRUPT      allow free list to be completely drained
1332  *      VM_ALLOC_ZERO           advisory request for pre-zero'd page only
1333  *      VM_ALLOC_FORCE_ZERO     advisory request for pre-zero'd page only
1334  *      VM_ALLOC_NULL_OK        ok to return NULL on insertion collision
1335  *                              (see vm_page_grab())
1336  *      VM_ALLOC_USE_GD         ok to use per-gd cache
1337  *
1338  * The object must be held if not NULL
1339  * This routine may not block
1340  *
1341  * Additional special handling is required when called from an interrupt
1342  * (VM_ALLOC_INTERRUPT).  We are not allowed to mess with the page cache
1343  * in this case.
1344  */
1345 vm_page_t
1346 vm_page_alloc(vm_object_t object, vm_pindex_t pindex, int page_req)
1347 {
1348 #ifdef SMP
1349         globaldata_t gd = mycpu;
1350 #endif
1351         vm_page_t m;
1352         u_short pg_color;
1353
1354 #if 0
1355         /*
1356          * Special per-cpu free VM page cache.  The pages are pre-busied
1357          * and pre-zerod for us.
1358          */
1359         if (gd->gd_vmpg_count && (page_req & VM_ALLOC_USE_GD)) {
1360                 crit_enter_gd(gd);
1361                 if (gd->gd_vmpg_count) {
1362                         m = gd->gd_vmpg_array[--gd->gd_vmpg_count];
1363                         crit_exit_gd(gd);
1364                         goto done;
1365                 }
1366                 crit_exit_gd(gd);
1367         }
1368 #endif
1369         m = NULL;
1370
1371 #ifdef SMP
1372         /*
1373          * Cpu twist - cpu localization algorithm
1374          */
1375         if (object) {
1376                 pg_color = gd->gd_cpuid + (pindex & ~ncpus_fit_mask) +
1377                            (object->pg_color & ~ncpus_fit_mask);
1378         } else {
1379                 pg_color = gd->gd_cpuid + (pindex & ~ncpus_fit_mask);
1380         }
1381 #else
1382         /*
1383          * Normal page coloring algorithm
1384          */
1385         if (object) {
1386                 pg_color = object->pg_color + pindex;
1387         } else {
1388                 pg_color = pindex;
1389         }
1390 #endif
1391         KKASSERT(page_req & 
1392                 (VM_ALLOC_NORMAL|VM_ALLOC_QUICK|
1393                  VM_ALLOC_INTERRUPT|VM_ALLOC_SYSTEM));
1394
1395         /*
1396          * Certain system threads (pageout daemon, buf_daemon's) are
1397          * allowed to eat deeper into the free page list.
1398          */
1399         if (curthread->td_flags & TDF_SYSTHREAD)
1400                 page_req |= VM_ALLOC_SYSTEM;
1401
1402 loop:
1403         if (vmstats.v_free_count > vmstats.v_free_reserved ||
1404             ((page_req & VM_ALLOC_INTERRUPT) && vmstats.v_free_count > 0) ||
1405             ((page_req & VM_ALLOC_SYSTEM) && vmstats.v_cache_count == 0 &&
1406                 vmstats.v_free_count > vmstats.v_interrupt_free_min)
1407         ) {
1408                 /*
1409                  * The free queue has sufficient free pages to take one out.
1410                  */
1411                 if (page_req & (VM_ALLOC_ZERO | VM_ALLOC_FORCE_ZERO))
1412                         m = vm_page_select_free(pg_color, TRUE);
1413                 else
1414                         m = vm_page_select_free(pg_color, FALSE);
1415         } else if (page_req & VM_ALLOC_NORMAL) {
1416                 /*
1417                  * Allocatable from the cache (non-interrupt only).  On
1418                  * success, we must free the page and try again, thus
1419                  * ensuring that vmstats.v_*_free_min counters are replenished.
1420                  */
1421 #ifdef INVARIANTS
1422                 if (curthread->td_preempted) {
1423                         kprintf("vm_page_alloc(): warning, attempt to allocate"
1424                                 " cache page from preempting interrupt\n");
1425                         m = NULL;
1426                 } else {
1427                         m = vm_page_select_cache(pg_color);
1428                 }
1429 #else
1430                 m = vm_page_select_cache(pg_color);
1431 #endif
1432                 /*
1433                  * On success move the page into the free queue and loop.
1434                  */
1435                 if (m != NULL) {
1436                         KASSERT(m->dirty == 0,
1437                                 ("Found dirty cache page %p", m));
1438                         vm_page_protect(m, VM_PROT_NONE);
1439                         vm_page_free(m);
1440                         goto loop;
1441                 }
1442
1443                 /*
1444                  * On failure return NULL
1445                  */
1446 #if defined(DIAGNOSTIC)
1447                 if (vmstats.v_cache_count > 0)
1448                         kprintf("vm_page_alloc(NORMAL): missing pages on cache queue: %d\n", vmstats.v_cache_count);
1449 #endif
1450                 vm_pageout_deficit++;
1451                 pagedaemon_wakeup();
1452                 return (NULL);
1453         } else {
1454                 /*
1455                  * No pages available, wakeup the pageout daemon and give up.
1456                  */
1457                 vm_pageout_deficit++;
1458                 pagedaemon_wakeup();
1459                 return (NULL);
1460         }
1461
1462         /*
1463          * v_free_count can race so loop if we don't find the expected
1464          * page.
1465          */
1466         if (m == NULL)
1467                 goto loop;
1468
1469         /*
1470          * Good page found.  The page has already been busied for us and
1471          * removed from its queues.
1472          */
1473         KASSERT(m->dirty == 0,
1474                 ("vm_page_alloc: free/cache page %p was dirty", m));
1475         KKASSERT(m->queue == PQ_NONE);
1476
1477 #if 0
1478 done:
1479 #endif
1480         /*
1481          * Initialize the structure, inheriting some flags but clearing
1482          * all the rest.  The page has already been busied for us.
1483          */
1484         vm_page_flag_clear(m, ~(PG_ZERO | PG_BUSY | PG_SBUSY));
1485         KKASSERT(m->wire_count == 0);
1486         KKASSERT(m->busy == 0);
1487         m->act_count = 0;
1488         m->valid = 0;
1489
1490         /*
1491          * Caller must be holding the object lock (asserted by
1492          * vm_page_insert()).
1493          *
1494          * NOTE: Inserting a page here does not insert it into any pmaps
1495          *       (which could cause us to block allocating memory).
1496          *
1497          * NOTE: If no object an unassociated page is allocated, m->pindex
1498          *       can be used by the caller for any purpose.
1499          */
1500         if (object) {
1501                 if (vm_page_insert(m, object, pindex) == FALSE) {
1502                         kprintf("PAGE RACE (%p:%d,%"PRIu64")\n",
1503                                 object, object->type, pindex);
1504                         vm_page_free(m);
1505                         m = NULL;
1506                         if ((page_req & VM_ALLOC_NULL_OK) == 0)
1507                                 panic("PAGE RACE");
1508                 }
1509         } else {
1510                 m->pindex = pindex;
1511         }
1512
1513         /*
1514          * Don't wakeup too often - wakeup the pageout daemon when
1515          * we would be nearly out of memory.
1516          */
1517         pagedaemon_wakeup();
1518
1519         /*
1520          * A PG_BUSY page is returned.
1521          */
1522         return (m);
1523 }
1524
1525 /*
1526  * Wait for sufficient free memory for nominal heavy memory use kernel
1527  * operations.
1528  */
1529 void
1530 vm_wait_nominal(void)
1531 {
1532         while (vm_page_count_min(0))
1533                 vm_wait(0);
1534 }
1535
1536 /*
1537  * Test if vm_wait_nominal() would block.
1538  */
1539 int
1540 vm_test_nominal(void)
1541 {
1542         if (vm_page_count_min(0))
1543                 return(1);
1544         return(0);
1545 }
1546
1547 /*
1548  * Block until free pages are available for allocation, called in various
1549  * places before memory allocations.
1550  *
1551  * The caller may loop if vm_page_count_min() == FALSE so we cannot be
1552  * more generous then that.
1553  */
1554 void
1555 vm_wait(int timo)
1556 {
1557         /*
1558          * never wait forever
1559          */
1560         if (timo == 0)
1561                 timo = hz;
1562         lwkt_gettoken(&vm_token);
1563
1564         if (curthread == pagethread) {
1565                 /*
1566                  * The pageout daemon itself needs pages, this is bad.
1567                  */
1568                 if (vm_page_count_min(0)) {
1569                         vm_pageout_pages_needed = 1;
1570                         tsleep(&vm_pageout_pages_needed, 0, "VMWait", timo);
1571                 }
1572         } else {
1573                 /*
1574                  * Wakeup the pageout daemon if necessary and wait.
1575                  */
1576                 if (vm_page_count_target()) {
1577                         if (vm_pages_needed == 0) {
1578                                 vm_pages_needed = 1;
1579                                 wakeup(&vm_pages_needed);
1580                         }
1581                         ++vm_pages_waiting;     /* SMP race ok */
1582                         tsleep(&vmstats.v_free_count, 0, "vmwait", timo);
1583                 }
1584         }
1585         lwkt_reltoken(&vm_token);
1586 }
1587
1588 /*
1589  * Block until free pages are available for allocation
1590  *
1591  * Called only from vm_fault so that processes page faulting can be
1592  * easily tracked.
1593  */
1594 void
1595 vm_waitpfault(void)
1596 {
1597         /*
1598          * Wakeup the pageout daemon if necessary and wait.
1599          */
1600         if (vm_page_count_target()) {
1601                 lwkt_gettoken(&vm_token);
1602                 if (vm_page_count_target()) {
1603                         if (vm_pages_needed == 0) {
1604                                 vm_pages_needed = 1;
1605                                 wakeup(&vm_pages_needed);
1606                         }
1607                         ++vm_pages_waiting;     /* SMP race ok */
1608                         tsleep(&vmstats.v_free_count, 0, "pfault", hz);
1609                 }
1610                 lwkt_reltoken(&vm_token);
1611         }
1612 }
1613
1614 /*
1615  * Put the specified page on the active list (if appropriate).  Ensure
1616  * that act_count is at least ACT_INIT but do not otherwise mess with it.
1617  *
1618  * The caller should be holding the page busied ? XXX
1619  * This routine may not block.
1620  */
1621 void
1622 vm_page_activate(vm_page_t m)
1623 {
1624         u_short oqueue;
1625
1626         vm_page_spin_lock(m);
1627         if (m->queue - m->pc != PQ_ACTIVE) {
1628                 _vm_page_queue_spin_lock(m);
1629                 oqueue = _vm_page_rem_queue_spinlocked(m);
1630                 /* page is left spinlocked, queue is unlocked */
1631
1632                 if (oqueue == PQ_CACHE)
1633                         mycpu->gd_cnt.v_reactivated++;
1634                 if (m->wire_count == 0 && (m->flags & PG_UNMANAGED) == 0) {
1635                         if (m->act_count < ACT_INIT)
1636                                 m->act_count = ACT_INIT;
1637                         _vm_page_add_queue_spinlocked(m, PQ_ACTIVE + m->pc, 0);
1638                 }
1639                 _vm_page_and_queue_spin_unlock(m);
1640                 if (oqueue == PQ_CACHE || oqueue == PQ_FREE)
1641                         pagedaemon_wakeup();
1642         } else {
1643                 if (m->act_count < ACT_INIT)
1644                         m->act_count = ACT_INIT;
1645                 vm_page_spin_unlock(m);
1646         }
1647 }
1648
1649 /*
1650  * Helper routine for vm_page_free_toq() and vm_page_cache().  This
1651  * routine is called when a page has been added to the cache or free
1652  * queues.
1653  *
1654  * This routine may not block.
1655  */
1656 static __inline void
1657 vm_page_free_wakeup(void)
1658 {
1659         /*
1660          * If the pageout daemon itself needs pages, then tell it that
1661          * there are some free.
1662          */
1663         if (vm_pageout_pages_needed &&
1664             vmstats.v_cache_count + vmstats.v_free_count >= 
1665             vmstats.v_pageout_free_min
1666         ) {
1667                 wakeup(&vm_pageout_pages_needed);
1668                 vm_pageout_pages_needed = 0;
1669         }
1670
1671         /*
1672          * Wakeup processes that are waiting on memory.
1673          *
1674          * NOTE: vm_paging_target() is the pageout daemon's target, while
1675          *       vm_page_count_target() is somewhere inbetween.  We want
1676          *       to wake processes up prior to the pageout daemon reaching
1677          *       its target to provide some hysteresis.
1678          */
1679         if (vm_pages_waiting) {
1680                 if (!vm_page_count_target()) {
1681                         /*
1682                          * Plenty of pages are free, wakeup everyone.
1683                          */
1684                         vm_pages_waiting = 0;
1685                         wakeup(&vmstats.v_free_count);
1686                         ++mycpu->gd_cnt.v_ppwakeups;
1687                 } else if (!vm_page_count_min(0)) {
1688                         /*
1689                          * Some pages are free, wakeup someone.
1690                          */
1691                         int wcount = vm_pages_waiting;
1692                         if (wcount > 0)
1693                                 --wcount;
1694                         vm_pages_waiting = wcount;
1695                         wakeup_one(&vmstats.v_free_count);
1696                         ++mycpu->gd_cnt.v_ppwakeups;
1697                 }
1698         }
1699 }
1700
1701 /*
1702  * Returns the given page to the PQ_FREE or PQ_HOLD list and disassociates
1703  * it from its VM object.
1704  *
1705  * The vm_page must be PG_BUSY on entry.  PG_BUSY will be released on
1706  * return (the page will have been freed).
1707  */
1708 void
1709 vm_page_free_toq(vm_page_t m)
1710 {
1711         mycpu->gd_cnt.v_tfree++;
1712         KKASSERT((m->flags & PG_MAPPED) == 0);
1713         KKASSERT(m->flags & PG_BUSY);
1714
1715         if (m->busy || ((m->queue - m->pc) == PQ_FREE)) {
1716                 kprintf(
1717                 "vm_page_free: pindex(%lu), busy(%d), PG_BUSY(%d), hold(%d)\n",
1718                     (u_long)m->pindex, m->busy, (m->flags & PG_BUSY) ? 1 : 0,
1719                     m->hold_count);
1720                 if ((m->queue - m->pc) == PQ_FREE)
1721                         panic("vm_page_free: freeing free page");
1722                 else
1723                         panic("vm_page_free: freeing busy page");
1724         }
1725
1726         /*
1727          * Remove from object, spinlock the page and its queues and
1728          * remove from any queue.  No queue spinlock will be held
1729          * after this section (because the page was removed from any
1730          * queue).
1731          */
1732         vm_page_remove(m);
1733         vm_page_and_queue_spin_lock(m);
1734         _vm_page_rem_queue_spinlocked(m);
1735
1736         /*
1737          * No further management of fictitious pages occurs beyond object
1738          * and queue removal.
1739          */
1740         if ((m->flags & PG_FICTITIOUS) != 0) {
1741                 vm_page_spin_unlock(m);
1742                 vm_page_wakeup(m);
1743                 return;
1744         }
1745
1746         m->valid = 0;
1747         vm_page_undirty(m);
1748
1749         if (m->wire_count != 0) {
1750                 if (m->wire_count > 1) {
1751                     panic(
1752                         "vm_page_free: invalid wire count (%d), pindex: 0x%lx",
1753                         m->wire_count, (long)m->pindex);
1754                 }
1755                 panic("vm_page_free: freeing wired page");
1756         }
1757
1758         /*
1759          * Clear the UNMANAGED flag when freeing an unmanaged page.
1760          */
1761         if (m->flags & PG_UNMANAGED) {
1762                 vm_page_flag_clear(m, PG_UNMANAGED);
1763         }
1764
1765         if (m->hold_count != 0) {
1766                 vm_page_flag_clear(m, PG_ZERO);
1767                 _vm_page_add_queue_spinlocked(m, PQ_HOLD + m->pc, 0);
1768         } else {
1769                 _vm_page_add_queue_spinlocked(m, PQ_FREE + m->pc, 0);
1770         }
1771
1772         /*
1773          * This sequence allows us to clear PG_BUSY while still holding
1774          * its spin lock, which reduces contention vs allocators.  We
1775          * must not leave the queue locked or _vm_page_wakeup() may
1776          * deadlock.
1777          */
1778         _vm_page_queue_spin_unlock(m);
1779         if (_vm_page_wakeup(m)) {
1780                 vm_page_spin_unlock(m);
1781                 wakeup(m);
1782         } else {
1783                 vm_page_spin_unlock(m);
1784         }
1785         vm_page_free_wakeup();
1786 }
1787
1788 /*
1789  * vm_page_free_fromq_fast()
1790  *
1791  * Remove a non-zero page from one of the free queues; the page is removed for
1792  * zeroing, so do not issue a wakeup.
1793  */
1794 vm_page_t
1795 vm_page_free_fromq_fast(void)
1796 {
1797         static int qi;
1798         vm_page_t m;
1799         int i;
1800
1801         for (i = 0; i < PQ_L2_SIZE; ++i) {
1802                 m = vm_page_list_find(PQ_FREE, qi, FALSE);
1803                 /* page is returned spinlocked and removed from its queue */
1804                 if (m) {
1805                         if (vm_page_busy_try(m, TRUE)) {
1806                                 /*
1807                                  * We were unable to busy the page, deactivate
1808                                  * it and loop.
1809                                  */
1810                                 _vm_page_deactivate_locked(m, 0);
1811                                 vm_page_spin_unlock(m);
1812                         } else if (m->flags & PG_ZERO) {
1813                                 /*
1814                                  * The page is PG_ZERO, requeue it and loop
1815                                  */
1816                                 _vm_page_add_queue_spinlocked(m,
1817                                                               PQ_FREE + m->pc,
1818                                                               0);
1819                                 vm_page_queue_spin_unlock(m);
1820                                 if (_vm_page_wakeup(m)) {
1821                                         vm_page_spin_unlock(m);
1822                                         wakeup(m);
1823                                 } else {
1824                                         vm_page_spin_unlock(m);
1825                                 }
1826                         } else {
1827                                 /*
1828                                  * The page is not PG_ZERO'd so return it.
1829                                  */
1830                                 vm_page_spin_unlock(m);
1831                                 KKASSERT((m->flags & PG_UNMANAGED) == 0);
1832                                 KKASSERT(m->hold_count == 0);
1833                                 KKASSERT(m->wire_count == 0);
1834                                 break;
1835                         }
1836                         m = NULL;
1837                 }
1838                 qi = (qi + PQ_PRIME2) & PQ_L2_MASK;
1839         }
1840         return (m);
1841 }
1842
1843 /*
1844  * vm_page_unmanage()
1845  *
1846  * Prevent PV management from being done on the page.  The page is
1847  * removed from the paging queues as if it were wired, and as a 
1848  * consequence of no longer being managed the pageout daemon will not
1849  * touch it (since there is no way to locate the pte mappings for the
1850  * page).  madvise() calls that mess with the pmap will also no longer
1851  * operate on the page.
1852  *
1853  * Beyond that the page is still reasonably 'normal'.  Freeing the page
1854  * will clear the flag.
1855  *
1856  * This routine is used by OBJT_PHYS objects - objects using unswappable
1857  * physical memory as backing store rather then swap-backed memory and
1858  * will eventually be extended to support 4MB unmanaged physical 
1859  * mappings.
1860  *
1861  * Caller must be holding the page busy.
1862  */
1863 void
1864 vm_page_unmanage(vm_page_t m)
1865 {
1866         KKASSERT(m->flags & PG_BUSY);
1867         if ((m->flags & PG_UNMANAGED) == 0) {
1868                 if (m->wire_count == 0)
1869                         vm_page_unqueue(m);
1870         }
1871         vm_page_flag_set(m, PG_UNMANAGED);
1872 }
1873
1874 /*
1875  * Mark this page as wired down by yet another map, removing it from
1876  * paging queues as necessary.
1877  *
1878  * Caller must be holding the page busy.
1879  */
1880 void
1881 vm_page_wire(vm_page_t m)
1882 {
1883         /*
1884          * Only bump the wire statistics if the page is not already wired,
1885          * and only unqueue the page if it is on some queue (if it is unmanaged
1886          * it is already off the queues).  Don't do anything with fictitious
1887          * pages because they are always wired.
1888          */
1889         KKASSERT(m->flags & PG_BUSY);
1890         if ((m->flags & PG_FICTITIOUS) == 0) {
1891                 if (atomic_fetchadd_int(&m->wire_count, 1) == 0) {
1892                         if ((m->flags & PG_UNMANAGED) == 0)
1893                                 vm_page_unqueue(m);
1894                         atomic_add_int(&vmstats.v_wire_count, 1);
1895                 }
1896                 KASSERT(m->wire_count != 0,
1897                         ("vm_page_wire: wire_count overflow m=%p", m));
1898         }
1899 }
1900
1901 /*
1902  * Release one wiring of this page, potentially enabling it to be paged again.
1903  *
1904  * Many pages placed on the inactive queue should actually go
1905  * into the cache, but it is difficult to figure out which.  What
1906  * we do instead, if the inactive target is well met, is to put
1907  * clean pages at the head of the inactive queue instead of the tail.
1908  * This will cause them to be moved to the cache more quickly and
1909  * if not actively re-referenced, freed more quickly.  If we just
1910  * stick these pages at the end of the inactive queue, heavy filesystem
1911  * meta-data accesses can cause an unnecessary paging load on memory bound 
1912  * processes.  This optimization causes one-time-use metadata to be
1913  * reused more quickly.
1914  *
1915  * BUT, if we are in a low-memory situation we have no choice but to
1916  * put clean pages on the cache queue.
1917  *
1918  * A number of routines use vm_page_unwire() to guarantee that the page
1919  * will go into either the inactive or active queues, and will NEVER
1920  * be placed in the cache - for example, just after dirtying a page.
1921  * dirty pages in the cache are not allowed.
1922  *
1923  * The page queues must be locked.
1924  * This routine may not block.
1925  */
1926 void
1927 vm_page_unwire(vm_page_t m, int activate)
1928 {
1929         KKASSERT(m->flags & PG_BUSY);
1930         if (m->flags & PG_FICTITIOUS) {
1931                 /* do nothing */
1932         } else if (m->wire_count <= 0) {
1933                 panic("vm_page_unwire: invalid wire count: %d", m->wire_count);
1934         } else {
1935                 if (atomic_fetchadd_int(&m->wire_count, -1) == 1) {
1936                         atomic_add_int(&vmstats.v_wire_count, -1);
1937                         if (m->flags & PG_UNMANAGED) {
1938                                 ;
1939                         } else if (activate) {
1940                                 vm_page_spin_lock(m);
1941                                 _vm_page_add_queue_spinlocked(m,
1942                                                         PQ_ACTIVE + m->pc, 0);
1943                                 _vm_page_and_queue_spin_unlock(m);
1944                         } else {
1945                                 vm_page_spin_lock(m);
1946                                 vm_page_flag_clear(m, PG_WINATCFLS);
1947                                 _vm_page_add_queue_spinlocked(m,
1948                                                         PQ_INACTIVE + m->pc, 0);
1949                                 ++vm_swapcache_inactive_heuristic;
1950                                 _vm_page_and_queue_spin_unlock(m);
1951                         }
1952                 }
1953         }
1954 }
1955
1956 /*
1957  * Move the specified page to the inactive queue.  If the page has
1958  * any associated swap, the swap is deallocated.
1959  *
1960  * Normally athead is 0 resulting in LRU operation.  athead is set
1961  * to 1 if we want this page to be 'as if it were placed in the cache',
1962  * except without unmapping it from the process address space.
1963  *
1964  * vm_page's spinlock must be held on entry and will remain held on return.
1965  * This routine may not block.
1966  */
1967 static void
1968 _vm_page_deactivate_locked(vm_page_t m, int athead)
1969 {
1970         u_short oqueue;
1971
1972         /*
1973          * Ignore if already inactive.
1974          */
1975         if (m->queue - m->pc == PQ_INACTIVE)
1976                 return;
1977         _vm_page_queue_spin_lock(m);
1978         oqueue = _vm_page_rem_queue_spinlocked(m);
1979
1980         if (m->wire_count == 0 && (m->flags & PG_UNMANAGED) == 0) {
1981                 if (oqueue == PQ_CACHE)
1982                         mycpu->gd_cnt.v_reactivated++;
1983                 vm_page_flag_clear(m, PG_WINATCFLS);
1984                 _vm_page_add_queue_spinlocked(m, PQ_INACTIVE + m->pc, athead);
1985                 if (athead == 0)
1986                         ++vm_swapcache_inactive_heuristic;
1987         }
1988         _vm_page_queue_spin_unlock(m);
1989         /* leaves vm_page spinlocked */
1990 }
1991
1992 /*
1993  * Attempt to deactivate a page.
1994  *
1995  * No requirements.
1996  */
1997 void
1998 vm_page_deactivate(vm_page_t m)
1999 {
2000         vm_page_spin_lock(m);
2001         _vm_page_deactivate_locked(m, 0);
2002         vm_page_spin_unlock(m);
2003 }
2004
2005 void
2006 vm_page_deactivate_locked(vm_page_t m)
2007 {
2008         _vm_page_deactivate_locked(m, 0);
2009 }
2010
2011 /*
2012  * Attempt to move a page to PQ_CACHE.
2013  *
2014  * Returns 0 on failure, 1 on success
2015  *
2016  * The page should NOT be busied by the caller.  This function will validate
2017  * whether the page can be safely moved to the cache.
2018  */
2019 int
2020 vm_page_try_to_cache(vm_page_t m)
2021 {
2022         vm_page_spin_lock(m);
2023         if (vm_page_busy_try(m, TRUE)) {
2024                 vm_page_spin_unlock(m);
2025                 return(0);
2026         }
2027         if (m->dirty || m->hold_count || m->wire_count ||
2028             (m->flags & PG_UNMANAGED)) {
2029                 if (_vm_page_wakeup(m)) {
2030                         vm_page_spin_unlock(m);
2031                         wakeup(m);
2032                 } else {
2033                         vm_page_spin_unlock(m);
2034                 }
2035                 return(0);
2036         }
2037         vm_page_spin_unlock(m);
2038
2039         /*
2040          * Page busied by us and no longer spinlocked.  Dirty pages cannot
2041          * be moved to the cache.
2042          */
2043         vm_page_test_dirty(m);
2044         if (m->dirty) {
2045                 vm_page_wakeup(m);
2046                 return(0);
2047         }
2048         vm_page_cache(m);
2049         return(1);
2050 }
2051
2052 /*
2053  * Attempt to free the page.  If we cannot free it, we do nothing.
2054  * 1 is returned on success, 0 on failure.
2055  *
2056  * No requirements.
2057  */
2058 int
2059 vm_page_try_to_free(vm_page_t m)
2060 {
2061         vm_page_spin_lock(m);
2062         if (vm_page_busy_try(m, TRUE)) {
2063                 vm_page_spin_unlock(m);
2064                 return(0);
2065         }
2066         if (m->dirty || m->hold_count || m->wire_count ||
2067             (m->flags & PG_UNMANAGED)) {
2068                 if (_vm_page_wakeup(m)) {
2069                         vm_page_spin_unlock(m);
2070                         wakeup(m);
2071                 } else {
2072                         vm_page_spin_unlock(m);
2073                 }
2074                 return(0);
2075         }
2076         vm_page_spin_unlock(m);
2077
2078         /*
2079          * Page busied by us and no longer spinlocked.  Dirty pages will
2080          * not be freed by this function.    We have to re-test the
2081          * dirty bit after cleaning out the pmaps.
2082          */
2083         vm_page_test_dirty(m);
2084         if (m->dirty) {
2085                 vm_page_wakeup(m);
2086                 return(0);
2087         }
2088         vm_page_protect(m, VM_PROT_NONE);
2089         if (m->dirty) {
2090                 vm_page_wakeup(m);
2091                 return(0);
2092         }
2093         vm_page_free(m);
2094         return(1);
2095 }
2096
2097 /*
2098  * vm_page_cache
2099  *
2100  * Put the specified page onto the page cache queue (if appropriate).
2101  *
2102  * The page must be busy, and this routine will release the busy and
2103  * possibly even free the page.
2104  */
2105 void
2106 vm_page_cache(vm_page_t m)
2107 {
2108         if ((m->flags & PG_UNMANAGED) || m->busy ||
2109             m->wire_count || m->hold_count) {
2110                 kprintf("vm_page_cache: attempting to cache busy/held page\n");
2111                 vm_page_wakeup(m);
2112                 return;
2113         }
2114
2115         /*
2116          * Already in the cache (and thus not mapped)
2117          */
2118         if ((m->queue - m->pc) == PQ_CACHE) {
2119                 KKASSERT((m->flags & PG_MAPPED) == 0);
2120                 vm_page_wakeup(m);
2121                 return;
2122         }
2123
2124         /*
2125          * Caller is required to test m->dirty, but note that the act of
2126          * removing the page from its maps can cause it to become dirty
2127          * on an SMP system due to another cpu running in usermode.
2128          */
2129         if (m->dirty) {
2130                 panic("vm_page_cache: caching a dirty page, pindex: %ld",
2131                         (long)m->pindex);
2132         }
2133
2134         /*
2135          * Remove all pmaps and indicate that the page is not
2136          * writeable or mapped.  Our vm_page_protect() call may
2137          * have blocked (especially w/ VM_PROT_NONE), so recheck
2138          * everything.
2139          */
2140         vm_page_protect(m, VM_PROT_NONE);
2141         if ((m->flags & (PG_UNMANAGED|PG_MAPPED)) || m->busy ||
2142                         m->wire_count || m->hold_count) {
2143                 vm_page_wakeup(m);
2144         } else if (m->dirty) {
2145                 vm_page_deactivate(m);
2146                 vm_page_wakeup(m);
2147         } else {
2148                 _vm_page_and_queue_spin_lock(m);
2149                 _vm_page_rem_queue_spinlocked(m);
2150                 _vm_page_add_queue_spinlocked(m, PQ_CACHE + m->pc, 0);
2151                 _vm_page_queue_spin_unlock(m);
2152                 if (_vm_page_wakeup(m)) {
2153                         vm_page_spin_unlock(m);
2154                         wakeup(m);
2155                 } else {
2156                         vm_page_spin_unlock(m);
2157                 }
2158                 vm_page_free_wakeup();
2159         }
2160 }
2161
2162 /*
2163  * vm_page_dontneed()
2164  *
2165  * Cache, deactivate, or do nothing as appropriate.  This routine
2166  * is typically used by madvise() MADV_DONTNEED.
2167  *
2168  * Generally speaking we want to move the page into the cache so
2169  * it gets reused quickly.  However, this can result in a silly syndrome
2170  * due to the page recycling too quickly.  Small objects will not be
2171  * fully cached.  On the otherhand, if we move the page to the inactive
2172  * queue we wind up with a problem whereby very large objects 
2173  * unnecessarily blow away our inactive and cache queues.
2174  *
2175  * The solution is to move the pages based on a fixed weighting.  We
2176  * either leave them alone, deactivate them, or move them to the cache,
2177  * where moving them to the cache has the highest weighting.
2178  * By forcing some pages into other queues we eventually force the
2179  * system to balance the queues, potentially recovering other unrelated
2180  * space from active.  The idea is to not force this to happen too
2181  * often.
2182  *
2183  * The page must be busied.
2184  */
2185 void
2186 vm_page_dontneed(vm_page_t m)
2187 {
2188         static int dnweight;
2189         int dnw;
2190         int head;
2191
2192         dnw = ++dnweight;
2193
2194         /*
2195          * occassionally leave the page alone
2196          */
2197         if ((dnw & 0x01F0) == 0 ||
2198             m->queue - m->pc == PQ_INACTIVE ||
2199             m->queue - m->pc == PQ_CACHE
2200         ) {
2201                 if (m->act_count >= ACT_INIT)
2202                         --m->act_count;
2203                 return;
2204         }
2205
2206         /*
2207          * If vm_page_dontneed() is inactivating a page, it must clear
2208          * the referenced flag; otherwise the pagedaemon will see references
2209          * on the page in the inactive queue and reactivate it. Until the 
2210          * page can move to the cache queue, madvise's job is not done.
2211          */
2212         vm_page_flag_clear(m, PG_REFERENCED);
2213         pmap_clear_reference(m);
2214
2215         if (m->dirty == 0)
2216                 vm_page_test_dirty(m);
2217
2218         if (m->dirty || (dnw & 0x0070) == 0) {
2219                 /*
2220                  * Deactivate the page 3 times out of 32.
2221                  */
2222                 head = 0;
2223         } else {
2224                 /*
2225                  * Cache the page 28 times out of every 32.  Note that
2226                  * the page is deactivated instead of cached, but placed
2227                  * at the head of the queue instead of the tail.
2228                  */
2229                 head = 1;
2230         }
2231         vm_page_spin_lock(m);
2232         _vm_page_deactivate_locked(m, head);
2233         vm_page_spin_unlock(m);
2234 }
2235
2236 /*
2237  * These routines manipulate the 'soft busy' count for a page.  A soft busy
2238  * is almost like PG_BUSY except that it allows certain compatible operations
2239  * to occur on the page while it is busy.  For example, a page undergoing a
2240  * write can still be mapped read-only.
2241  *
2242  * Because vm_pages can overlap buffers m->busy can be > 1.  m->busy is only
2243  * adjusted while the vm_page is PG_BUSY so the flash will occur when the
2244  * busy bit is cleared.
2245  */
2246 void
2247 vm_page_io_start(vm_page_t m)
2248 {
2249         KASSERT(m->flags & PG_BUSY, ("vm_page_io_start: page not busy!!!"));
2250         atomic_add_char(&m->busy, 1);
2251         vm_page_flag_set(m, PG_SBUSY);
2252 }
2253
2254 void
2255 vm_page_io_finish(vm_page_t m)
2256 {
2257         KASSERT(m->flags & PG_BUSY, ("vm_page_io_finish: page not busy!!!"));
2258         atomic_subtract_char(&m->busy, 1);
2259         if (m->busy == 0)
2260                 vm_page_flag_clear(m, PG_SBUSY);
2261 }
2262
2263 /*
2264  * Grab a page, blocking if it is busy and allocating a page if necessary.
2265  * A busy page is returned or NULL.  The page may or may not be valid and
2266  * might not be on a queue (the caller is responsible for the disposition of
2267  * the page).
2268  *
2269  * If VM_ALLOC_ZERO is specified and the grab must allocate a new page, the
2270  * page will be zero'd and marked valid.
2271  *
2272  * If VM_ALLOC_FORCE_ZERO is specified the page will be zero'd and marked
2273  * valid even if it already exists.
2274  *
2275  * If VM_ALLOC_RETRY is specified this routine will never return NULL.  Also
2276  * note that VM_ALLOC_NORMAL must be specified if VM_ALLOC_RETRY is specified.
2277  *
2278  * This routine may block, but if VM_ALLOC_RETRY is not set then NULL is
2279  * always returned if we had blocked.  
2280  *
2281  * This routine may not be called from an interrupt.
2282  *
2283  * PG_ZERO is *ALWAYS* cleared by this routine.
2284  *
2285  * No other requirements.
2286  */
2287 vm_page_t
2288 vm_page_grab(vm_object_t object, vm_pindex_t pindex, int allocflags)
2289 {
2290         vm_page_t m;
2291         int error;
2292
2293         KKASSERT(allocflags &
2294                 (VM_ALLOC_NORMAL|VM_ALLOC_INTERRUPT|VM_ALLOC_SYSTEM));
2295         vm_object_hold(object);
2296         for (;;) {
2297                 m = vm_page_lookup_busy_try(object, pindex, TRUE, &error);
2298                 if (error) {
2299                         vm_page_sleep_busy(m, TRUE, "pgrbwt");
2300                         if ((allocflags & VM_ALLOC_RETRY) == 0) {
2301                                 m = NULL;
2302                                 break;
2303                         }
2304                         /* retry */
2305                 } else if (m == NULL) {
2306                         m = vm_page_alloc(object, pindex,
2307                                           allocflags & ~VM_ALLOC_RETRY);
2308                         if (m)
2309                                 break;
2310                         vm_wait(0);
2311                         if ((allocflags & VM_ALLOC_RETRY) == 0)
2312                                 goto failed;
2313                 } else {
2314                         /* m found */
2315                         break;
2316                 }
2317         }
2318
2319         /*
2320          * If VM_ALLOC_ZERO an invalid page will be zero'd and set valid.
2321          *
2322          * If VM_ALLOC_FORCE_ZERO the page is unconditionally zero'd and set
2323          * valid even if already valid.
2324          */
2325         if (m->valid == 0) {
2326                 if (allocflags & (VM_ALLOC_ZERO | VM_ALLOC_FORCE_ZERO)) {
2327                         if ((m->flags & PG_ZERO) == 0)
2328                                 pmap_zero_page(VM_PAGE_TO_PHYS(m));
2329                         m->valid = VM_PAGE_BITS_ALL;
2330                 }
2331         } else if (allocflags & VM_ALLOC_FORCE_ZERO) {
2332                 pmap_zero_page(VM_PAGE_TO_PHYS(m));
2333                 m->valid = VM_PAGE_BITS_ALL;
2334         }
2335         vm_page_flag_clear(m, PG_ZERO);
2336 failed:
2337         vm_object_drop(object);
2338         return(m);
2339 }
2340
2341 /*
2342  * Mapping function for valid bits or for dirty bits in
2343  * a page.  May not block.
2344  *
2345  * Inputs are required to range within a page.
2346  *
2347  * No requirements.
2348  * Non blocking.
2349  */
2350 int
2351 vm_page_bits(int base, int size)
2352 {
2353         int first_bit;
2354         int last_bit;
2355
2356         KASSERT(
2357             base + size <= PAGE_SIZE,
2358             ("vm_page_bits: illegal base/size %d/%d", base, size)
2359         );
2360
2361         if (size == 0)          /* handle degenerate case */
2362                 return(0);
2363
2364         first_bit = base >> DEV_BSHIFT;
2365         last_bit = (base + size - 1) >> DEV_BSHIFT;
2366
2367         return ((2 << last_bit) - (1 << first_bit));
2368 }
2369
2370 /*
2371  * Sets portions of a page valid and clean.  The arguments are expected
2372  * to be DEV_BSIZE aligned but if they aren't the bitmap is inclusive
2373  * of any partial chunks touched by the range.  The invalid portion of
2374  * such chunks will be zero'd.
2375  *
2376  * NOTE: When truncating a buffer vnode_pager_setsize() will automatically
2377  *       align base to DEV_BSIZE so as not to mark clean a partially
2378  *       truncated device block.  Otherwise the dirty page status might be
2379  *       lost.
2380  *
2381  * This routine may not block.
2382  *
2383  * (base + size) must be less then or equal to PAGE_SIZE.
2384  */
2385 static void
2386 _vm_page_zero_valid(vm_page_t m, int base, int size)
2387 {
2388         int frag;
2389         int endoff;
2390
2391         if (size == 0)  /* handle degenerate case */
2392                 return;
2393
2394         /*
2395          * If the base is not DEV_BSIZE aligned and the valid
2396          * bit is clear, we have to zero out a portion of the
2397          * first block.
2398          */
2399
2400         if ((frag = base & ~(DEV_BSIZE - 1)) != base &&
2401             (m->valid & (1 << (base >> DEV_BSHIFT))) == 0
2402         ) {
2403                 pmap_zero_page_area(
2404                     VM_PAGE_TO_PHYS(m),
2405                     frag,
2406                     base - frag
2407                 );
2408         }
2409
2410         /*
2411          * If the ending offset is not DEV_BSIZE aligned and the 
2412          * valid bit is clear, we have to zero out a portion of
2413          * the last block.
2414          */
2415
2416         endoff = base + size;
2417
2418         if ((frag = endoff & ~(DEV_BSIZE - 1)) != endoff &&
2419             (m->valid & (1 << (endoff >> DEV_BSHIFT))) == 0
2420         ) {
2421                 pmap_zero_page_area(
2422                     VM_PAGE_TO_PHYS(m),
2423                     endoff,
2424                     DEV_BSIZE - (endoff & (DEV_BSIZE - 1))
2425                 );
2426         }
2427 }
2428
2429 /*
2430  * Set valid, clear dirty bits.  If validating the entire
2431  * page we can safely clear the pmap modify bit.  We also
2432  * use this opportunity to clear the PG_NOSYNC flag.  If a process
2433  * takes a write fault on a MAP_NOSYNC memory area the flag will
2434  * be set again.
2435  *
2436  * We set valid bits inclusive of any overlap, but we can only
2437  * clear dirty bits for DEV_BSIZE chunks that are fully within
2438  * the range.
2439  *
2440  * Page must be busied?
2441  * No other requirements.
2442  */
2443 void
2444 vm_page_set_valid(vm_page_t m, int base, int size)
2445 {
2446         _vm_page_zero_valid(m, base, size);
2447         m->valid |= vm_page_bits(base, size);
2448 }
2449
2450
2451 /*
2452  * Set valid bits and clear dirty bits.
2453  *
2454  * NOTE: This function does not clear the pmap modified bit.
2455  *       Also note that e.g. NFS may use a byte-granular base
2456  *       and size.
2457  *
2458  * WARNING: Page must be busied?  But vfs_clean_one_page() will call
2459  *          this without necessarily busying the page (via bdwrite()).
2460  *          So for now vm_token must also be held.
2461  *
2462  * No other requirements.
2463  */
2464 void
2465 vm_page_set_validclean(vm_page_t m, int base, int size)
2466 {
2467         int pagebits;
2468
2469         _vm_page_zero_valid(m, base, size);
2470         pagebits = vm_page_bits(base, size);
2471         m->valid |= pagebits;
2472         m->dirty &= ~pagebits;
2473         if (base == 0 && size == PAGE_SIZE) {
2474                 /*pmap_clear_modify(m);*/
2475                 vm_page_flag_clear(m, PG_NOSYNC);
2476         }
2477 }
2478
2479 /*
2480  * Set valid & dirty.  Used by buwrite()
2481  *
2482  * WARNING: Page must be busied?  But vfs_dirty_one_page() will
2483  *          call this function in buwrite() so for now vm_token must
2484  *          be held.
2485  *
2486  * No other requirements.
2487  */
2488 void
2489 vm_page_set_validdirty(vm_page_t m, int base, int size)
2490 {
2491         int pagebits;
2492
2493         pagebits = vm_page_bits(base, size);
2494         m->valid |= pagebits;
2495         m->dirty |= pagebits;
2496         if (m->object)
2497                 vm_object_set_writeable_dirty(m->object);
2498 }
2499
2500 /*
2501  * Clear dirty bits.
2502  *
2503  * NOTE: This function does not clear the pmap modified bit.
2504  *       Also note that e.g. NFS may use a byte-granular base
2505  *       and size.
2506  *
2507  * Page must be busied?
2508  * No other requirements.
2509  */
2510 void
2511 vm_page_clear_dirty(vm_page_t m, int base, int size)
2512 {
2513         m->dirty &= ~vm_page_bits(base, size);
2514         if (base == 0 && size == PAGE_SIZE) {
2515                 /*pmap_clear_modify(m);*/
2516                 vm_page_flag_clear(m, PG_NOSYNC);
2517         }
2518 }
2519
2520 /*
2521  * Make the page all-dirty.
2522  *
2523  * Also make sure the related object and vnode reflect the fact that the
2524  * object may now contain a dirty page.
2525  *
2526  * Page must be busied?
2527  * No other requirements.
2528  */
2529 void
2530 vm_page_dirty(vm_page_t m)
2531 {
2532 #ifdef INVARIANTS
2533         int pqtype = m->queue - m->pc;
2534 #endif
2535         KASSERT(pqtype != PQ_CACHE && pqtype != PQ_FREE,
2536                 ("vm_page_dirty: page in free/cache queue!"));
2537         if (m->dirty != VM_PAGE_BITS_ALL) {
2538                 m->dirty = VM_PAGE_BITS_ALL;
2539                 if (m->object)
2540                         vm_object_set_writeable_dirty(m->object);
2541         }
2542 }
2543
2544 /*
2545  * Invalidates DEV_BSIZE'd chunks within a page.  Both the
2546  * valid and dirty bits for the effected areas are cleared.
2547  *
2548  * Page must be busied?
2549  * Does not block.
2550  * No other requirements.
2551  */
2552 void
2553 vm_page_set_invalid(vm_page_t m, int base, int size)
2554 {
2555         int bits;
2556
2557         bits = vm_page_bits(base, size);
2558         m->valid &= ~bits;
2559         m->dirty &= ~bits;
2560         m->object->generation++;
2561 }
2562
2563 /*
2564  * The kernel assumes that the invalid portions of a page contain 
2565  * garbage, but such pages can be mapped into memory by user code.
2566  * When this occurs, we must zero out the non-valid portions of the
2567  * page so user code sees what it expects.
2568  *
2569  * Pages are most often semi-valid when the end of a file is mapped 
2570  * into memory and the file's size is not page aligned.
2571  *
2572  * Page must be busied?
2573  * No other requirements.
2574  */
2575 void
2576 vm_page_zero_invalid(vm_page_t m, boolean_t setvalid)
2577 {
2578         int b;
2579         int i;
2580
2581         /*
2582          * Scan the valid bits looking for invalid sections that
2583          * must be zerod.  Invalid sub-DEV_BSIZE'd areas ( where the
2584          * valid bit may be set ) have already been zerod by
2585          * vm_page_set_validclean().
2586          */
2587         for (b = i = 0; i <= PAGE_SIZE / DEV_BSIZE; ++i) {
2588                 if (i == (PAGE_SIZE / DEV_BSIZE) || 
2589                     (m->valid & (1 << i))
2590                 ) {
2591                         if (i > b) {
2592                                 pmap_zero_page_area(
2593                                     VM_PAGE_TO_PHYS(m), 
2594                                     b << DEV_BSHIFT,
2595                                     (i - b) << DEV_BSHIFT
2596                                 );
2597                         }
2598                         b = i + 1;
2599                 }
2600         }
2601
2602         /*
2603          * setvalid is TRUE when we can safely set the zero'd areas
2604          * as being valid.  We can do this if there are no cache consistency
2605          * issues.  e.g. it is ok to do with UFS, but not ok to do with NFS.
2606          */
2607         if (setvalid)
2608                 m->valid = VM_PAGE_BITS_ALL;
2609 }
2610
2611 /*
2612  * Is a (partial) page valid?  Note that the case where size == 0
2613  * will return FALSE in the degenerate case where the page is entirely
2614  * invalid, and TRUE otherwise.
2615  *
2616  * Does not block.
2617  * No other requirements.
2618  */
2619 int
2620 vm_page_is_valid(vm_page_t m, int base, int size)
2621 {
2622         int bits = vm_page_bits(base, size);
2623
2624         if (m->valid && ((m->valid & bits) == bits))
2625                 return 1;
2626         else
2627                 return 0;
2628 }
2629
2630 /*
2631  * update dirty bits from pmap/mmu.  May not block.
2632  *
2633  * Caller must hold the page busy
2634  */
2635 void
2636 vm_page_test_dirty(vm_page_t m)
2637 {
2638         if ((m->dirty != VM_PAGE_BITS_ALL) && pmap_is_modified(m)) {
2639                 vm_page_dirty(m);
2640         }
2641 }
2642
2643 /*
2644  * Register an action, associating it with its vm_page
2645  */
2646 void
2647 vm_page_register_action(vm_page_action_t action, vm_page_event_t event)
2648 {
2649         struct vm_page_action_list *list;
2650         int hv;
2651
2652         hv = (int)((intptr_t)action->m >> 8) & VMACTION_HMASK;
2653         list = &action_list[hv];
2654
2655         lwkt_gettoken(&vm_token);
2656         vm_page_flag_set(action->m, PG_ACTIONLIST);
2657         action->event = event;
2658         LIST_INSERT_HEAD(list, action, entry);
2659         lwkt_reltoken(&vm_token);
2660 }
2661
2662 /*
2663  * Unregister an action, disassociating it from its related vm_page
2664  */
2665 void
2666 vm_page_unregister_action(vm_page_action_t action)
2667 {
2668         struct vm_page_action_list *list;
2669         int hv;
2670
2671         lwkt_gettoken(&vm_token);
2672         if (action->event != VMEVENT_NONE) {
2673                 action->event = VMEVENT_NONE;
2674                 LIST_REMOVE(action, entry);
2675
2676                 hv = (int)((intptr_t)action->m >> 8) & VMACTION_HMASK;
2677                 list = &action_list[hv];
2678                 if (LIST_EMPTY(list))
2679                         vm_page_flag_clear(action->m, PG_ACTIONLIST);
2680         }
2681         lwkt_reltoken(&vm_token);
2682 }
2683
2684 /*
2685  * Issue an event on a VM page.  Corresponding action structures are
2686  * removed from the page's list and called.
2687  *
2688  * If the vm_page has no more pending action events we clear its
2689  * PG_ACTIONLIST flag.
2690  */
2691 void
2692 vm_page_event_internal(vm_page_t m, vm_page_event_t event)
2693 {
2694         struct vm_page_action_list *list;
2695         struct vm_page_action *scan;
2696         struct vm_page_action *next;
2697         int hv;
2698         int all;
2699
2700         hv = (int)((intptr_t)m >> 8) & VMACTION_HMASK;
2701         list = &action_list[hv];
2702         all = 1;
2703
2704         lwkt_gettoken(&vm_token);
2705         LIST_FOREACH_MUTABLE(scan, list, entry, next) {
2706                 if (scan->m == m) {
2707                         if (scan->event == event) {
2708                                 scan->event = VMEVENT_NONE;
2709                                 LIST_REMOVE(scan, entry);
2710                                 scan->func(m, scan);
2711                                 /* XXX */
2712                         } else {
2713                                 all = 0;
2714                         }
2715                 }
2716         }
2717         if (all)
2718                 vm_page_flag_clear(m, PG_ACTIONLIST);
2719         lwkt_reltoken(&vm_token);
2720 }
2721
2722 #include "opt_ddb.h"
2723 #ifdef DDB
2724 #include <sys/kernel.h>
2725
2726 #include <ddb/ddb.h>
2727
2728 DB_SHOW_COMMAND(page, vm_page_print_page_info)
2729 {
2730         db_printf("vmstats.v_free_count: %d\n", vmstats.v_free_count);
2731         db_printf("vmstats.v_cache_count: %d\n", vmstats.v_cache_count);
2732         db_printf("vmstats.v_inactive_count: %d\n", vmstats.v_inactive_count);
2733         db_printf("vmstats.v_active_count: %d\n", vmstats.v_active_count);
2734         db_printf("vmstats.v_wire_count: %d\n", vmstats.v_wire_count);
2735         db_printf("vmstats.v_free_reserved: %d\n", vmstats.v_free_reserved);
2736         db_printf("vmstats.v_free_min: %d\n", vmstats.v_free_min);
2737         db_printf("vmstats.v_free_target: %d\n", vmstats.v_free_target);
2738         db_printf("vmstats.v_cache_min: %d\n", vmstats.v_cache_min);
2739         db_printf("vmstats.v_inactive_target: %d\n", vmstats.v_inactive_target);
2740 }
2741
2742 DB_SHOW_COMMAND(pageq, vm_page_print_pageq_info)
2743 {
2744         int i;
2745         db_printf("PQ_FREE:");
2746         for(i=0;i<PQ_L2_SIZE;i++) {
2747                 db_printf(" %d", vm_page_queues[PQ_FREE + i].lcnt);
2748         }
2749         db_printf("\n");
2750                 
2751         db_printf("PQ_CACHE:");
2752         for(i=0;i<PQ_L2_SIZE;i++) {
2753                 db_printf(" %d", vm_page_queues[PQ_CACHE + i].lcnt);
2754         }
2755         db_printf("\n");
2756
2757         db_printf("PQ_ACTIVE:");
2758         for(i=0;i<PQ_L2_SIZE;i++) {
2759                 db_printf(" %d", vm_page_queues[PQ_ACTIVE + i].lcnt);
2760         }
2761         db_printf("\n");
2762
2763         db_printf("PQ_INACTIVE:");
2764         for(i=0;i<PQ_L2_SIZE;i++) {
2765                 db_printf(" %d", vm_page_queues[PQ_INACTIVE + i].lcnt);
2766         }
2767         db_printf("\n");
2768 }
2769 #endif /* DDB */