Merge branch 'vendor/LDNS'
[dragonfly.git] / sys / vm / vm_object.c
1 /*
2  * (MPSAFE)
3  *
4  * Copyright (c) 1991, 1993
5  *      The Regents of the University of California.  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  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *      This product includes software developed by the University of
21  *      California, Berkeley and its contributors.
22  * 4. Neither the name of the University nor the names of its contributors
23  *    may be used to endorse or promote products derived from this software
24  *    without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36  * SUCH DAMAGE.
37  *
38  *      from: @(#)vm_object.c   8.5 (Berkeley) 3/22/94
39  *
40  *
41  * Copyright (c) 1987, 1990 Carnegie-Mellon University.
42  * All rights reserved.
43  *
44  * Authors: Avadis Tevanian, Jr., Michael Wayne Young
45  *
46  * Permission to use, copy, modify and distribute this software and
47  * its documentation is hereby granted, provided that both the copyright
48  * notice and this permission notice appear in all copies of the
49  * software, derivative works or modified versions, and any portions
50  * thereof, and that both notices appear in supporting documentation.
51  *
52  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
53  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
54  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
55  *
56  * Carnegie Mellon requests users of this software to return to
57  *
58  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
59  *  School of Computer Science
60  *  Carnegie Mellon University
61  *  Pittsburgh PA 15213-3890
62  *
63  * any improvements or extensions that they make and grant Carnegie the
64  * rights to redistribute these changes.
65  *
66  * $FreeBSD: src/sys/vm/vm_object.c,v 1.171.2.8 2003/05/26 19:17:56 alc Exp $
67  */
68
69 /*
70  *      Virtual memory object module.
71  */
72
73 #include <sys/param.h>
74 #include <sys/systm.h>
75 #include <sys/proc.h>           /* for curproc, pageproc */
76 #include <sys/thread.h>
77 #include <sys/vnode.h>
78 #include <sys/vmmeter.h>
79 #include <sys/mman.h>
80 #include <sys/mount.h>
81 #include <sys/kernel.h>
82 #include <sys/sysctl.h>
83 #include <sys/refcount.h>
84
85 #include <vm/vm.h>
86 #include <vm/vm_param.h>
87 #include <vm/pmap.h>
88 #include <vm/vm_map.h>
89 #include <vm/vm_object.h>
90 #include <vm/vm_page.h>
91 #include <vm/vm_pageout.h>
92 #include <vm/vm_pager.h>
93 #include <vm/swap_pager.h>
94 #include <vm/vm_kern.h>
95 #include <vm/vm_extern.h>
96 #include <vm/vm_zone.h>
97
98 #define EASY_SCAN_FACTOR        8
99
100 static void     vm_object_qcollapse(vm_object_t object);
101 static int      vm_object_page_collect_flush(vm_object_t object, vm_page_t p,
102                                              int pagerflags);
103 static void     vm_object_lock_init(vm_object_t);
104 static void     vm_object_hold_wake(vm_object_t);
105 static void     vm_object_hold_wait(vm_object_t);
106
107
108 /*
109  *      Virtual memory objects maintain the actual data
110  *      associated with allocated virtual memory.  A given
111  *      page of memory exists within exactly one object.
112  *
113  *      An object is only deallocated when all "references"
114  *      are given up.  Only one "reference" to a given
115  *      region of an object should be writeable.
116  *
117  *      Associated with each object is a list of all resident
118  *      memory pages belonging to that object; this list is
119  *      maintained by the "vm_page" module, and locked by the object's
120  *      lock.
121  *
122  *      Each object also records a "pager" routine which is
123  *      used to retrieve (and store) pages to the proper backing
124  *      storage.  In addition, objects may be backed by other
125  *      objects from which they were virtual-copied.
126  *
127  *      The only items within the object structure which are
128  *      modified after time of creation are:
129  *              reference count         locked by object's lock
130  *              pager routine           locked by object's lock
131  *
132  */
133
134 struct object_q vm_object_list;         /* locked by vmobj_token */
135 struct vm_object kernel_object;
136
137 static long vm_object_count;            /* locked by vmobj_token */
138 extern int vm_pageout_page_count;
139
140 static long object_collapses;
141 static long object_bypasses;
142 static int next_index;
143 static vm_zone_t obj_zone;
144 static struct vm_zone obj_zone_store;
145 #define VM_OBJECTS_INIT 256
146 static struct vm_object vm_objects_init[VM_OBJECTS_INIT];
147
148 /*
149  * Initialize a freshly allocated object
150  *
151  * Used only by vm_object_allocate() and zinitna().
152  *
153  * No requirements.
154  */
155 void
156 _vm_object_allocate(objtype_t type, vm_pindex_t size, vm_object_t object)
157 {
158         int incr;
159
160         RB_INIT(&object->rb_memq);
161         LIST_INIT(&object->shadow_head);
162
163         object->type = type;
164         object->size = size;
165         object->ref_count = 1;
166         object->hold_count = 0;
167         object->flags = 0;
168         if ((object->type == OBJT_DEFAULT) || (object->type == OBJT_SWAP))
169                 vm_object_set_flag(object, OBJ_ONEMAPPING);
170         object->paging_in_progress = 0;
171         object->resident_page_count = 0;
172         object->agg_pv_list_count = 0;
173         object->shadow_count = 0;
174         object->pg_color = next_index;
175         if ( size > (PQ_L2_SIZE / 3 + PQ_PRIME1))
176                 incr = PQ_L2_SIZE / 3 + PQ_PRIME1;
177         else
178                 incr = size;
179         next_index = (next_index + incr) & PQ_L2_MASK;
180         object->handle = NULL;
181         object->backing_object = NULL;
182         object->backing_object_offset = (vm_ooffset_t) 0;
183
184         object->generation++;
185         object->swblock_count = 0;
186         RB_INIT(&object->swblock_root);
187         vm_object_lock_init(object);
188
189         lwkt_gettoken(&vmobj_token);
190         TAILQ_INSERT_TAIL(&vm_object_list, object, object_list);
191         vm_object_count++;
192         lwkt_reltoken(&vmobj_token);
193 }
194
195 /*
196  * Initialize the VM objects module.
197  *
198  * Called from the low level boot code only.
199  */
200 void
201 vm_object_init(void)
202 {
203         TAILQ_INIT(&vm_object_list);
204         
205         _vm_object_allocate(OBJT_DEFAULT, OFF_TO_IDX(KvaEnd),
206                             &kernel_object);
207
208         obj_zone = &obj_zone_store;
209         zbootinit(obj_zone, "VM OBJECT", sizeof (struct vm_object),
210                 vm_objects_init, VM_OBJECTS_INIT);
211 }
212
213 void
214 vm_object_init2(void)
215 {
216         zinitna(obj_zone, NULL, NULL, 0, 0, ZONE_PANICFAIL, 1);
217 }
218
219 /*
220  * Allocate and return a new object of the specified type and size.
221  *
222  * No requirements.
223  */
224 vm_object_t
225 vm_object_allocate(objtype_t type, vm_pindex_t size)
226 {
227         vm_object_t result;
228
229         result = (vm_object_t) zalloc(obj_zone);
230
231         _vm_object_allocate(type, size, result);
232
233         return (result);
234 }
235
236 /*
237  * Add an additional reference to a vm_object.
238  *
239  * Object passed by caller must be stable or caller must already
240  * hold vmobj_token to avoid races.
241  */
242 void
243 vm_object_reference(vm_object_t object)
244 {
245         lwkt_gettoken(&vmobj_token);
246         vm_object_reference_locked(object);
247         lwkt_reltoken(&vmobj_token);
248 }
249
250 void
251 vm_object_reference_locked(vm_object_t object)
252 {
253         if (object) {
254                 ASSERT_LWKT_TOKEN_HELD(&vmobj_token);
255                 object->ref_count++;
256                 if (object->type == OBJT_VNODE) {
257                         vref(object->handle);
258                         /* XXX what if the vnode is being destroyed? */
259                 }
260         }
261 }
262
263 /*
264  * Dereference an object and its underlying vnode.
265  *
266  * The caller must hold vmobj_token.
267  */
268 static void
269 vm_object_vndeallocate(vm_object_t object)
270 {
271         struct vnode *vp = (struct vnode *) object->handle;
272
273         KASSERT(object->type == OBJT_VNODE,
274             ("vm_object_vndeallocate: not a vnode object"));
275         KASSERT(vp != NULL, ("vm_object_vndeallocate: missing vp"));
276         ASSERT_LWKT_TOKEN_HELD(&vmobj_token);
277 #ifdef INVARIANTS
278         if (object->ref_count == 0) {
279                 vprint("vm_object_vndeallocate", vp);
280                 panic("vm_object_vndeallocate: bad object reference count");
281         }
282 #endif
283
284         object->ref_count--;
285         if (object->ref_count == 0)
286                 vclrflags(vp, VTEXT);
287         vrele(vp);
288 }
289
290 /*
291  * Release a reference to the specified object, gained either through a
292  * vm_object_allocate or a vm_object_reference call.  When all references
293  * are gone, storage associated with this object may be relinquished.
294  */
295 void
296 vm_object_deallocate(vm_object_t object)
297 {
298         lwkt_gettoken(&vmobj_token);
299         vm_object_deallocate_locked(object);
300         lwkt_reltoken(&vmobj_token);
301 }
302
303 void
304 vm_object_deallocate_locked(vm_object_t object)
305 {
306         vm_object_t temp;
307
308         ASSERT_LWKT_TOKEN_HELD(&vmobj_token);
309
310         while (object != NULL) {
311                 if (object->type == OBJT_VNODE) {
312                         vm_object_vndeallocate(object);
313                         break;
314                 }
315
316                 if (object->ref_count == 0) {
317                         panic("vm_object_deallocate: object deallocated "
318                               "too many times: %d", object->type);
319                 }
320                 if (object->ref_count > 2) {
321                         object->ref_count--;
322                         break;
323                 }
324
325                 /*
326                  * We currently need the vm_token from this point on, and
327                  * we must recheck ref_count after acquiring it.
328                  */
329                 lwkt_gettoken(&vm_token);
330
331                 if (object->ref_count > 2) {
332                         object->ref_count--;
333                         lwkt_reltoken(&vm_token);
334                         break;
335                 }
336
337                 /*
338                  * Here on ref_count of one or two, which are special cases for
339                  * objects.
340                  */
341                 if ((object->ref_count == 2) && (object->shadow_count == 0)) {
342                         vm_object_set_flag(object, OBJ_ONEMAPPING);
343                         object->ref_count--;
344                         lwkt_reltoken(&vm_token);
345                         break;
346                 }
347                 if ((object->ref_count == 2) && (object->shadow_count == 1)) {
348                         object->ref_count--;
349                         if ((object->handle == NULL) &&
350                             (object->type == OBJT_DEFAULT ||
351                              object->type == OBJT_SWAP)) {
352                                 vm_object_t robject;
353
354                                 robject = LIST_FIRST(&object->shadow_head);
355                                 KASSERT(robject != NULL,
356                                         ("vm_object_deallocate: ref_count: "
357                                         "%d, shadow_count: %d",
358                                         object->ref_count,
359                                         object->shadow_count));
360
361                                 if ((robject->handle == NULL) &&
362                                     (robject->type == OBJT_DEFAULT ||
363                                      robject->type == OBJT_SWAP)) {
364
365                                         robject->ref_count++;
366
367                                         while (
368                                                 robject->paging_in_progress ||
369                                                 object->paging_in_progress
370                                         ) {
371                                                 vm_object_pip_sleep(robject, "objde1");
372                                                 vm_object_pip_sleep(object, "objde2");
373                                         }
374
375                                         if (robject->ref_count == 1) {
376                                                 robject->ref_count--;
377                                                 object = robject;
378                                                 goto doterm;
379                                         }
380
381                                         object = robject;
382                                         vm_object_collapse(object);
383                                         lwkt_reltoken(&vm_token);
384                                         continue;
385                                 }
386                         }
387                         lwkt_reltoken(&vm_token);
388                         break;
389                 }
390
391                 /*
392                  * Normal dereferencing path
393                  */
394                 object->ref_count--;
395                 if (object->ref_count != 0) {
396                         lwkt_reltoken(&vm_token);
397                         break;
398                 }
399
400                 /*
401                  * Termination path
402                  */
403 doterm:
404                 temp = object->backing_object;
405                 if (temp) {
406                         LIST_REMOVE(object, shadow_list);
407                         temp->shadow_count--;
408                         temp->generation++;
409                         object->backing_object = NULL;
410                 }
411                 lwkt_reltoken(&vm_token);
412
413                 /*
414                  * Don't double-terminate, we could be in a termination
415                  * recursion due to the terminate having to sync data
416                  * to disk.
417                  */
418                 if ((object->flags & OBJ_DEAD) == 0)
419                         vm_object_terminate(object);
420                 object = temp;
421         }
422 }
423
424 /*
425  * Destroy the specified object, freeing up related resources.
426  *
427  * The object must have zero references.
428  *
429  * The caller must be holding vmobj_token and properly interlock with
430  * OBJ_DEAD.
431  */
432 static int vm_object_terminate_callback(vm_page_t p, void *data);
433
434 void
435 vm_object_terminate(vm_object_t object)
436 {
437         /*
438          * Make sure no one uses us.  Once we set OBJ_DEAD we should be
439          * able to safely block.
440          */
441         KKASSERT((object->flags & OBJ_DEAD) == 0);
442         ASSERT_LWKT_TOKEN_HELD(&vmobj_token);
443         vm_object_set_flag(object, OBJ_DEAD);
444
445         /*
446          * Wait for the pageout daemon to be done with the object
447          */
448         vm_object_pip_wait(object, "objtrm1");
449
450         KASSERT(!object->paging_in_progress,
451                 ("vm_object_terminate: pageout in progress"));
452
453         /*
454          * Clean and free the pages, as appropriate. All references to the
455          * object are gone, so we don't need to lock it.
456          */
457         if (object->type == OBJT_VNODE) {
458                 struct vnode *vp;
459
460                 /*
461                  * Clean pages and flush buffers.
462                  */
463                 vm_object_page_clean(object, 0, 0, OBJPC_SYNC);
464
465                 vp = (struct vnode *) object->handle;
466                 vinvalbuf(vp, V_SAVE, 0, 0);
467         }
468
469         /*
470          * Wait for any I/O to complete, after which there had better not
471          * be any references left on the object.
472          */
473         vm_object_pip_wait(object, "objtrm2");
474
475         if (object->ref_count != 0) {
476                 panic("vm_object_terminate: object with references, "
477                       "ref_count=%d", object->ref_count);
478         }
479
480         /*
481          * Now free any remaining pages. For internal objects, this also
482          * removes them from paging queues. Don't free wired pages, just
483          * remove them from the object. 
484          */
485         lwkt_gettoken(&vm_token);
486         vm_page_rb_tree_RB_SCAN(&object->rb_memq, NULL,
487                                 vm_object_terminate_callback, NULL);
488         lwkt_reltoken(&vm_token);
489
490         /*
491          * Let the pager know object is dead.
492          */
493         vm_pager_deallocate(object);
494
495         /*
496          * Wait for the object hold count to hit zero, clean out pages as
497          * we go.
498          */
499         lwkt_gettoken(&vm_token);
500         for (;;) {
501                 vm_object_hold_wait(object);
502                 if (RB_ROOT(&object->rb_memq) == NULL)
503                         break;
504                 kprintf("vm_object_terminate: Warning, object %p "
505                         "still has %d pages\n",
506                         object, object->resident_page_count);
507                 vm_page_rb_tree_RB_SCAN(&object->rb_memq, NULL,
508                                         vm_object_terminate_callback, NULL);
509         }
510         lwkt_reltoken(&vm_token);
511
512         /*
513          * There had better not be any pages left
514          */
515         KKASSERT(object->resident_page_count == 0);
516
517         /*
518          * Remove the object from the global object list.
519          *
520          * (we are holding vmobj_token)
521          */
522         TAILQ_REMOVE(&vm_object_list, object, object_list);
523         vm_object_count--;
524         vm_object_dead_wakeup(object);
525
526         if (object->ref_count != 0) {
527                 panic("vm_object_terminate2: object with references, "
528                       "ref_count=%d", object->ref_count);
529         }
530
531         /*
532          * Free the space for the object.
533          */
534         zfree(obj_zone, object);
535 }
536
537 /*
538  * The caller must hold vm_token.
539  */
540 static int
541 vm_object_terminate_callback(vm_page_t p, void *data __unused)
542 {
543         if (p->busy || (p->flags & PG_BUSY))
544                 panic("vm_object_terminate: freeing busy page %p", p);
545         if (p->wire_count == 0) {
546                 vm_page_busy(p);
547                 vm_page_free(p);
548                 mycpu->gd_cnt.v_pfree++;
549         } else {
550                 if (p->queue != PQ_NONE)
551                         kprintf("vm_object_terminate: Warning: Encountered wired page %p on queue %d\n", p, p->queue);
552                 vm_page_busy(p);
553                 vm_page_remove(p);
554                 vm_page_wakeup(p);
555         }
556         return(0);
557 }
558
559 /*
560  * The object is dead but still has an object<->pager association.  Sleep
561  * and return.  The caller typically retests the association in a loop.
562  *
563  * Must be called with the vmobj_token held.
564  */
565 void
566 vm_object_dead_sleep(vm_object_t object, const char *wmesg)
567 {
568         ASSERT_LWKT_TOKEN_HELD(&vmobj_token);
569         if (object->handle) {
570                 vm_object_set_flag(object, OBJ_DEADWNT);
571                 tsleep(object, 0, wmesg, 0);
572                 /* object may be invalid after this point */
573         }
574 }
575
576 /*
577  * Wakeup anyone waiting for the object<->pager disassociation on
578  * a dead object.
579  *
580  * Must be called with the vmobj_token held.
581  */
582 void
583 vm_object_dead_wakeup(vm_object_t object)
584 {
585         ASSERT_LWKT_TOKEN_HELD(&vmobj_token);
586         if (object->flags & OBJ_DEADWNT) {
587                 vm_object_clear_flag(object, OBJ_DEADWNT);
588                 wakeup(object);
589         }
590 }
591
592 /*
593  * Clean all dirty pages in the specified range of object.  Leaves page
594  * on whatever queue it is currently on.   If NOSYNC is set then do not
595  * write out pages with PG_NOSYNC set (originally comes from MAP_NOSYNC),
596  * leaving the object dirty.
597  *
598  * When stuffing pages asynchronously, allow clustering.  XXX we need a
599  * synchronous clustering mode implementation.
600  *
601  * Odd semantics: if start == end, we clean everything.
602  *
603  * The object must be locked? XXX
604  */
605 static int vm_object_page_clean_pass1(struct vm_page *p, void *data);
606 static int vm_object_page_clean_pass2(struct vm_page *p, void *data);
607
608 void
609 vm_object_page_clean(vm_object_t object, vm_pindex_t start, vm_pindex_t end,
610                      int flags)
611 {
612         struct rb_vm_page_scan_info info;
613         struct vnode *vp;
614         int wholescan;
615         int pagerflags;
616         int curgeneration;
617
618         vm_object_hold(object);
619         if (object->type != OBJT_VNODE ||
620             (object->flags & OBJ_MIGHTBEDIRTY) == 0) {
621                 vm_object_drop(object);
622                 return;
623         }
624
625         pagerflags = (flags & (OBJPC_SYNC | OBJPC_INVAL)) ? 
626                         VM_PAGER_PUT_SYNC : VM_PAGER_CLUSTER_OK;
627         pagerflags |= (flags & OBJPC_INVAL) ? VM_PAGER_PUT_INVAL : 0;
628
629         vp = object->handle;
630
631         /*
632          * Interlock other major object operations.  This allows us to 
633          * temporarily clear OBJ_WRITEABLE and OBJ_MIGHTBEDIRTY.
634          */
635         crit_enter();
636         vm_object_set_flag(object, OBJ_CLEANING);
637
638         /*
639          * Handle 'entire object' case
640          */
641         info.start_pindex = start;
642         if (end == 0) {
643                 info.end_pindex = object->size - 1;
644         } else {
645                 info.end_pindex = end - 1;
646         }
647         wholescan = (start == 0 && info.end_pindex == object->size - 1);
648         info.limit = flags;
649         info.pagerflags = pagerflags;
650         info.object = object;
651
652         /*
653          * If cleaning the entire object do a pass to mark the pages read-only.
654          * If everything worked out ok, clear OBJ_WRITEABLE and
655          * OBJ_MIGHTBEDIRTY.
656          */
657         if (wholescan) {
658                 info.error = 0;
659                 lwkt_gettoken(&vm_token);
660                 vm_page_rb_tree_RB_SCAN(&object->rb_memq, rb_vm_page_scancmp,
661                                         vm_object_page_clean_pass1, &info);
662                 lwkt_reltoken(&vm_token);
663                 if (info.error == 0) {
664                         vm_object_clear_flag(object,
665                                              OBJ_WRITEABLE|OBJ_MIGHTBEDIRTY);
666                         if (object->type == OBJT_VNODE &&
667                             (vp = (struct vnode *)object->handle) != NULL) {
668                                 if (vp->v_flag & VOBJDIRTY) 
669                                         vclrflags(vp, VOBJDIRTY);
670                         }
671                 }
672         }
673
674         /*
675          * Do a pass to clean all the dirty pages we find.
676          */
677         do {
678                 info.error = 0;
679                 curgeneration = object->generation;
680                 lwkt_gettoken(&vm_token);
681                 vm_page_rb_tree_RB_SCAN(&object->rb_memq, rb_vm_page_scancmp,
682                                         vm_object_page_clean_pass2, &info);
683                 lwkt_reltoken(&vm_token);
684         } while (info.error || curgeneration != object->generation);
685
686         vm_object_clear_flag(object, OBJ_CLEANING);
687         crit_exit();
688         vm_object_drop(object);
689 }
690
691 /*
692  * The caller must hold vm_token.
693  */
694 static 
695 int
696 vm_object_page_clean_pass1(struct vm_page *p, void *data)
697 {
698         struct rb_vm_page_scan_info *info = data;
699
700         vm_page_flag_set(p, PG_CLEANCHK);
701         if ((info->limit & OBJPC_NOSYNC) && (p->flags & PG_NOSYNC))
702                 info->error = 1;
703         else
704                 vm_page_protect(p, VM_PROT_READ);       /* must not block */
705         return(0);
706 }
707
708 /*
709  * The caller must hold vm_token.
710  */
711 static 
712 int
713 vm_object_page_clean_pass2(struct vm_page *p, void *data)
714 {
715         struct rb_vm_page_scan_info *info = data;
716         int n;
717
718         /*
719          * Do not mess with pages that were inserted after we started
720          * the cleaning pass.
721          */
722         if ((p->flags & PG_CLEANCHK) == 0)
723                 return(0);
724
725         /*
726          * Before wasting time traversing the pmaps, check for trivial
727          * cases where the page cannot be dirty.
728          */
729         if (p->valid == 0 || (p->queue - p->pc) == PQ_CACHE) {
730                 KKASSERT((p->dirty & p->valid) == 0);
731                 return(0);
732         }
733
734         /*
735          * Check whether the page is dirty or not.  The page has been set
736          * to be read-only so the check will not race a user dirtying the
737          * page.
738          */
739         vm_page_test_dirty(p);
740         if ((p->dirty & p->valid) == 0) {
741                 vm_page_flag_clear(p, PG_CLEANCHK);
742                 return(0);
743         }
744
745         /*
746          * If we have been asked to skip nosync pages and this is a
747          * nosync page, skip it.  Note that the object flags were
748          * not cleared in this case (because pass1 will have returned an
749          * error), so we do not have to set them.
750          */
751         if ((info->limit & OBJPC_NOSYNC) && (p->flags & PG_NOSYNC)) {
752                 vm_page_flag_clear(p, PG_CLEANCHK);
753                 return(0);
754         }
755
756         /*
757          * Flush as many pages as we can.  PG_CLEANCHK will be cleared on
758          * the pages that get successfully flushed.  Set info->error if
759          * we raced an object modification.
760          */
761         n = vm_object_page_collect_flush(info->object, p, info->pagerflags);
762         if (n == 0)
763                 info->error = 1;
764         return(0);
765 }
766
767 /*
768  * Collect the specified page and nearby pages and flush them out.
769  * The number of pages flushed is returned.
770  *
771  * The caller must hold vm_token.
772  */
773 static int
774 vm_object_page_collect_flush(vm_object_t object, vm_page_t p, int pagerflags)
775 {
776         int runlen;
777         int maxf;
778         int chkb;
779         int maxb;
780         int i;
781         int curgeneration;
782         vm_pindex_t pi;
783         vm_page_t maf[vm_pageout_page_count];
784         vm_page_t mab[vm_pageout_page_count];
785         vm_page_t ma[vm_pageout_page_count];
786
787         curgeneration = object->generation;
788
789         pi = p->pindex;
790         while (vm_page_sleep_busy(p, TRUE, "vpcwai")) {
791                 if (object->generation != curgeneration) {
792                         return(0);
793                 }
794         }
795         KKASSERT(p->object == object && p->pindex == pi);
796
797         maxf = 0;
798         for(i = 1; i < vm_pageout_page_count; i++) {
799                 vm_page_t tp;
800
801                 if ((tp = vm_page_lookup(object, pi + i)) != NULL) {
802                         if ((tp->flags & PG_BUSY) ||
803                                 ((pagerflags & VM_PAGER_IGNORE_CLEANCHK) == 0 && 
804                                  (tp->flags & PG_CLEANCHK) == 0) ||
805                                 (tp->busy != 0))
806                                 break;
807                         if((tp->queue - tp->pc) == PQ_CACHE) {
808                                 vm_page_flag_clear(tp, PG_CLEANCHK);
809                                 break;
810                         }
811                         vm_page_test_dirty(tp);
812                         if ((tp->dirty & tp->valid) == 0) {
813                                 vm_page_flag_clear(tp, PG_CLEANCHK);
814                                 break;
815                         }
816                         maf[ i - 1 ] = tp;
817                         maxf++;
818                         continue;
819                 }
820                 break;
821         }
822
823         maxb = 0;
824         chkb = vm_pageout_page_count -  maxf;
825         if (chkb) {
826                 for(i = 1; i < chkb;i++) {
827                         vm_page_t tp;
828
829                         if ((tp = vm_page_lookup(object, pi - i)) != NULL) {
830                                 if ((tp->flags & PG_BUSY) ||
831                                         ((pagerflags & VM_PAGER_IGNORE_CLEANCHK) == 0 && 
832                                          (tp->flags & PG_CLEANCHK) == 0) ||
833                                         (tp->busy != 0))
834                                         break;
835                                 if((tp->queue - tp->pc) == PQ_CACHE) {
836                                         vm_page_flag_clear(tp, PG_CLEANCHK);
837                                         break;
838                                 }
839                                 vm_page_test_dirty(tp);
840                                 if ((tp->dirty & tp->valid) == 0) {
841                                         vm_page_flag_clear(tp, PG_CLEANCHK);
842                                         break;
843                                 }
844                                 mab[ i - 1 ] = tp;
845                                 maxb++;
846                                 continue;
847                         }
848                         break;
849                 }
850         }
851
852         for(i = 0; i < maxb; i++) {
853                 int index = (maxb - i) - 1;
854                 ma[index] = mab[i];
855                 vm_page_flag_clear(ma[index], PG_CLEANCHK);
856         }
857         vm_page_flag_clear(p, PG_CLEANCHK);
858         ma[maxb] = p;
859         for(i = 0; i < maxf; i++) {
860                 int index = (maxb + i) + 1;
861                 ma[index] = maf[i];
862                 vm_page_flag_clear(ma[index], PG_CLEANCHK);
863         }
864         runlen = maxb + maxf + 1;
865
866         vm_pageout_flush(ma, runlen, pagerflags);
867         for (i = 0; i < runlen; i++) {
868                 if (ma[i]->valid & ma[i]->dirty) {
869                         vm_page_protect(ma[i], VM_PROT_READ);
870                         vm_page_flag_set(ma[i], PG_CLEANCHK);
871
872                         /*
873                          * maxf will end up being the actual number of pages
874                          * we wrote out contiguously, non-inclusive of the
875                          * first page.  We do not count look-behind pages.
876                          */
877                         if (i >= maxb + 1 && (maxf > i - maxb - 1))
878                                 maxf = i - maxb - 1;
879                 }
880         }
881         return(maxf + 1);
882 }
883
884 /*
885  * Same as vm_object_pmap_copy, except range checking really
886  * works, and is meant for small sections of an object.
887  *
888  * This code protects resident pages by making them read-only
889  * and is typically called on a fork or split when a page
890  * is converted to copy-on-write.  
891  *
892  * NOTE: If the page is already at VM_PROT_NONE, calling
893  * vm_page_protect will have no effect.
894  */
895 void
896 vm_object_pmap_copy_1(vm_object_t object, vm_pindex_t start, vm_pindex_t end)
897 {
898         vm_pindex_t idx;
899         vm_page_t p;
900
901         if (object == NULL || (object->flags & OBJ_WRITEABLE) == 0)
902                 return;
903
904         /*
905          * spl protection needed to prevent races between the lookup,
906          * an interrupt unbusy/free, and our protect call.
907          */
908         crit_enter();
909         lwkt_gettoken(&vm_token);
910         for (idx = start; idx < end; idx++) {
911                 p = vm_page_lookup(object, idx);
912                 if (p == NULL)
913                         continue;
914                 vm_page_protect(p, VM_PROT_READ);
915         }
916         lwkt_reltoken(&vm_token);
917         crit_exit();
918 }
919
920 /*
921  * Removes all physical pages in the specified object range from all
922  * physical maps.
923  *
924  * The object must *not* be locked.
925  */
926
927 static int vm_object_pmap_remove_callback(vm_page_t p, void *data);
928
929 void
930 vm_object_pmap_remove(vm_object_t object, vm_pindex_t start, vm_pindex_t end)
931 {
932         struct rb_vm_page_scan_info info;
933
934         if (object == NULL)
935                 return;
936         info.start_pindex = start;
937         info.end_pindex = end - 1;
938
939         crit_enter();
940         lwkt_gettoken(&vm_token);
941         vm_page_rb_tree_RB_SCAN(&object->rb_memq, rb_vm_page_scancmp,
942                                 vm_object_pmap_remove_callback, &info);
943         if (start == 0 && end == object->size)
944                 vm_object_clear_flag(object, OBJ_WRITEABLE);
945         lwkt_reltoken(&vm_token);
946         crit_exit();
947 }
948
949 /*
950  * The caller must hold vm_token.
951  */
952 static int
953 vm_object_pmap_remove_callback(vm_page_t p, void *data __unused)
954 {
955         vm_page_protect(p, VM_PROT_NONE);
956         return(0);
957 }
958
959 /*
960  * Implements the madvise function at the object/page level.
961  *
962  * MADV_WILLNEED        (any object)
963  *
964  *      Activate the specified pages if they are resident.
965  *
966  * MADV_DONTNEED        (any object)
967  *
968  *      Deactivate the specified pages if they are resident.
969  *
970  * MADV_FREE    (OBJT_DEFAULT/OBJT_SWAP objects, OBJ_ONEMAPPING only)
971  *
972  *      Deactivate and clean the specified pages if they are
973  *      resident.  This permits the process to reuse the pages
974  *      without faulting or the kernel to reclaim the pages
975  *      without I/O.
976  *
977  * No requirements.
978  */
979 void
980 vm_object_madvise(vm_object_t object, vm_pindex_t pindex, int count, int advise)
981 {
982         vm_pindex_t end, tpindex;
983         vm_object_t tobject;
984         vm_page_t m;
985
986         if (object == NULL)
987                 return;
988
989         end = pindex + count;
990
991         lwkt_gettoken(&vm_token);
992
993         /*
994          * Locate and adjust resident pages
995          */
996         for (; pindex < end; pindex += 1) {
997 relookup:
998                 tobject = object;
999                 tpindex = pindex;
1000 shadowlookup:
1001                 /*
1002                  * MADV_FREE only operates on OBJT_DEFAULT or OBJT_SWAP pages
1003                  * and those pages must be OBJ_ONEMAPPING.
1004                  */
1005                 if (advise == MADV_FREE) {
1006                         if ((tobject->type != OBJT_DEFAULT &&
1007                              tobject->type != OBJT_SWAP) ||
1008                             (tobject->flags & OBJ_ONEMAPPING) == 0) {
1009                                 continue;
1010                         }
1011                 }
1012
1013                 /*
1014                  * spl protection is required to avoid a race between the
1015                  * lookup, an interrupt unbusy/free, and our busy check.
1016                  */
1017
1018                 crit_enter();
1019                 m = vm_page_lookup(tobject, tpindex);
1020
1021                 if (m == NULL) {
1022                         /*
1023                          * There may be swap even if there is no backing page
1024                          */
1025                         if (advise == MADV_FREE && tobject->type == OBJT_SWAP)
1026                                 swap_pager_freespace(tobject, tpindex, 1);
1027
1028                         /*
1029                          * next object
1030                          */
1031                         crit_exit();
1032                         if (tobject->backing_object == NULL)
1033                                 continue;
1034                         tpindex += OFF_TO_IDX(tobject->backing_object_offset);
1035                         tobject = tobject->backing_object;
1036                         goto shadowlookup;
1037                 }
1038
1039                 /*
1040                  * If the page is busy or not in a normal active state,
1041                  * we skip it.  If the page is not managed there are no
1042                  * page queues to mess with.  Things can break if we mess
1043                  * with pages in any of the below states.
1044                  */
1045                 if (
1046                     m->hold_count ||
1047                     m->wire_count ||
1048                     (m->flags & PG_UNMANAGED) ||
1049                     m->valid != VM_PAGE_BITS_ALL
1050                 ) {
1051                         crit_exit();
1052                         continue;
1053                 }
1054
1055                 if (vm_page_sleep_busy(m, TRUE, "madvpo")) {
1056                         crit_exit();
1057                         goto relookup;
1058                 }
1059                 vm_page_busy(m);
1060                 crit_exit();
1061
1062                 /*
1063                  * Theoretically once a page is known not to be busy, an
1064                  * interrupt cannot come along and rip it out from under us.
1065                  */
1066
1067                 if (advise == MADV_WILLNEED) {
1068                         vm_page_activate(m);
1069                 } else if (advise == MADV_DONTNEED) {
1070                         vm_page_dontneed(m);
1071                 } else if (advise == MADV_FREE) {
1072                         /*
1073                          * Mark the page clean.  This will allow the page
1074                          * to be freed up by the system.  However, such pages
1075                          * are often reused quickly by malloc()/free()
1076                          * so we do not do anything that would cause
1077                          * a page fault if we can help it.
1078                          *
1079                          * Specifically, we do not try to actually free
1080                          * the page now nor do we try to put it in the
1081                          * cache (which would cause a page fault on reuse).
1082                          *
1083                          * But we do make the page is freeable as we
1084                          * can without actually taking the step of unmapping
1085                          * it.
1086                          */
1087                         pmap_clear_modify(m);
1088                         m->dirty = 0;
1089                         m->act_count = 0;
1090                         vm_page_dontneed(m);
1091                         if (tobject->type == OBJT_SWAP)
1092                                 swap_pager_freespace(tobject, tpindex, 1);
1093                 }
1094                 vm_page_wakeup(m);
1095         }       
1096         lwkt_reltoken(&vm_token);
1097 }
1098
1099 /*
1100  * Create a new object which is backed by the specified existing object
1101  * range.  The source object reference is deallocated.
1102  *
1103  * The new object and offset into that object are returned in the source
1104  * parameters.
1105  *
1106  * No other requirements.
1107  */
1108 void
1109 vm_object_shadow(vm_object_t *object, vm_ooffset_t *offset, vm_size_t length)
1110 {
1111         vm_object_t source;
1112         vm_object_t result;
1113
1114         source = *object;
1115
1116         /*
1117          * Don't create the new object if the old object isn't shared.
1118          */
1119         lwkt_gettoken(&vm_token);
1120
1121         if (source != NULL &&
1122             source->ref_count == 1 &&
1123             source->handle == NULL &&
1124             (source->type == OBJT_DEFAULT ||
1125              source->type == OBJT_SWAP)) {
1126                 lwkt_reltoken(&vm_token);
1127                 return;
1128         }
1129
1130         /*
1131          * Allocate a new object with the given length
1132          */
1133
1134         if ((result = vm_object_allocate(OBJT_DEFAULT, length)) == NULL)
1135                 panic("vm_object_shadow: no object for shadowing");
1136
1137         /*
1138          * The new object shadows the source object, adding a reference to it.
1139          * Our caller changes his reference to point to the new object,
1140          * removing a reference to the source object.  Net result: no change
1141          * of reference count.
1142          *
1143          * Try to optimize the result object's page color when shadowing
1144          * in order to maintain page coloring consistency in the combined 
1145          * shadowed object.
1146          */
1147         result->backing_object = source;
1148         if (source) {
1149                 LIST_INSERT_HEAD(&source->shadow_head, result, shadow_list);
1150                 source->shadow_count++;
1151                 source->generation++;
1152                 result->pg_color = (source->pg_color + OFF_TO_IDX(*offset)) & PQ_L2_MASK;
1153         }
1154
1155         /*
1156          * Store the offset into the source object, and fix up the offset into
1157          * the new object.
1158          */
1159         result->backing_object_offset = *offset;
1160         lwkt_reltoken(&vm_token);
1161
1162         /*
1163          * Return the new things
1164          */
1165         *offset = 0;
1166         *object = result;
1167 }
1168
1169 #define OBSC_TEST_ALL_SHADOWED  0x0001
1170 #define OBSC_COLLAPSE_NOWAIT    0x0002
1171 #define OBSC_COLLAPSE_WAIT      0x0004
1172
1173 static int vm_object_backing_scan_callback(vm_page_t p, void *data);
1174
1175 /*
1176  * The caller must hold vm_token.
1177  */
1178 static __inline int
1179 vm_object_backing_scan(vm_object_t object, int op)
1180 {
1181         struct rb_vm_page_scan_info info;
1182         vm_object_t backing_object;
1183
1184         crit_enter();
1185
1186         backing_object = object->backing_object;
1187         info.backing_offset_index = OFF_TO_IDX(object->backing_object_offset);
1188
1189         /*
1190          * Initial conditions
1191          */
1192
1193         if (op & OBSC_TEST_ALL_SHADOWED) {
1194                 /*
1195                  * We do not want to have to test for the existence of
1196                  * swap pages in the backing object.  XXX but with the
1197                  * new swapper this would be pretty easy to do.
1198                  *
1199                  * XXX what about anonymous MAP_SHARED memory that hasn't
1200                  * been ZFOD faulted yet?  If we do not test for this, the
1201                  * shadow test may succeed! XXX
1202                  */
1203                 if (backing_object->type != OBJT_DEFAULT) {
1204                         crit_exit();
1205                         return(0);
1206                 }
1207         }
1208         if (op & OBSC_COLLAPSE_WAIT) {
1209                 KKASSERT((backing_object->flags & OBJ_DEAD) == 0);
1210                 vm_object_set_flag(backing_object, OBJ_DEAD);
1211         }
1212
1213         /*
1214          * Our scan.   We have to retry if a negative error code is returned,
1215          * otherwise 0 or 1 will be returned in info.error.  0 Indicates that
1216          * the scan had to be stopped because the parent does not completely
1217          * shadow the child.
1218          */
1219         info.object = object;
1220         info.backing_object = backing_object;
1221         info.limit = op;
1222         do {
1223                 info.error = 1;
1224                 vm_page_rb_tree_RB_SCAN(&backing_object->rb_memq, NULL,
1225                                         vm_object_backing_scan_callback,
1226                                         &info);
1227         } while (info.error < 0);
1228         crit_exit();
1229         return(info.error);
1230 }
1231
1232 /*
1233  * The caller must hold vm_token.
1234  */
1235 static int
1236 vm_object_backing_scan_callback(vm_page_t p, void *data)
1237 {
1238         struct rb_vm_page_scan_info *info = data;
1239         vm_object_t backing_object;
1240         vm_object_t object;
1241         vm_pindex_t new_pindex;
1242         vm_pindex_t backing_offset_index;
1243         int op;
1244
1245         new_pindex = p->pindex - info->backing_offset_index;
1246         op = info->limit;
1247         object = info->object;
1248         backing_object = info->backing_object;
1249         backing_offset_index = info->backing_offset_index;
1250
1251         if (op & OBSC_TEST_ALL_SHADOWED) {
1252                 vm_page_t pp;
1253
1254                 /*
1255                  * Ignore pages outside the parent object's range
1256                  * and outside the parent object's mapping of the 
1257                  * backing object.
1258                  *
1259                  * note that we do not busy the backing object's
1260                  * page.
1261                  */
1262                 if (
1263                     p->pindex < backing_offset_index ||
1264                     new_pindex >= object->size
1265                 ) {
1266                         return(0);
1267                 }
1268
1269                 /*
1270                  * See if the parent has the page or if the parent's
1271                  * object pager has the page.  If the parent has the
1272                  * page but the page is not valid, the parent's
1273                  * object pager must have the page.
1274                  *
1275                  * If this fails, the parent does not completely shadow
1276                  * the object and we might as well give up now.
1277                  */
1278
1279                 pp = vm_page_lookup(object, new_pindex);
1280                 if ((pp == NULL || pp->valid == 0) &&
1281                     !vm_pager_has_page(object, new_pindex)
1282                 ) {
1283                         info->error = 0;        /* problemo */
1284                         return(-1);             /* stop the scan */
1285                 }
1286         }
1287
1288         /*
1289          * Check for busy page
1290          */
1291
1292         if (op & (OBSC_COLLAPSE_WAIT | OBSC_COLLAPSE_NOWAIT)) {
1293                 vm_page_t pp;
1294
1295                 if (op & OBSC_COLLAPSE_NOWAIT) {
1296                         if (
1297                             (p->flags & PG_BUSY) ||
1298                             !p->valid || 
1299                             p->hold_count || 
1300                             p->wire_count ||
1301                             p->busy
1302                         ) {
1303                                 return(0);
1304                         }
1305                 } else if (op & OBSC_COLLAPSE_WAIT) {
1306                         if (vm_page_sleep_busy(p, TRUE, "vmocol")) {
1307                                 /*
1308                                  * If we slept, anything could have
1309                                  * happened.   Ask that the scan be restarted.
1310                                  *
1311                                  * Since the object is marked dead, the
1312                                  * backing offset should not have changed.  
1313                                  */
1314                                 info->error = -1;
1315                                 return(-1);
1316                         }
1317                 }
1318
1319                 /* 
1320                  * Busy the page
1321                  */
1322                 vm_page_busy(p);
1323
1324                 KASSERT(
1325                     p->object == backing_object,
1326                     ("vm_object_qcollapse(): object mismatch")
1327                 );
1328
1329                 /*
1330                  * Destroy any associated swap
1331                  */
1332                 if (backing_object->type == OBJT_SWAP)
1333                         swap_pager_freespace(backing_object, p->pindex, 1);
1334
1335                 if (
1336                     p->pindex < backing_offset_index ||
1337                     new_pindex >= object->size
1338                 ) {
1339                         /*
1340                          * Page is out of the parent object's range, we 
1341                          * can simply destroy it. 
1342                          */
1343                         vm_page_protect(p, VM_PROT_NONE);
1344                         vm_page_free(p);
1345                         return(0);
1346                 }
1347
1348                 pp = vm_page_lookup(object, new_pindex);
1349                 if (pp != NULL || vm_pager_has_page(object, new_pindex)) {
1350                         /*
1351                          * page already exists in parent OR swap exists
1352                          * for this location in the parent.  Destroy 
1353                          * the original page from the backing object.
1354                          *
1355                          * Leave the parent's page alone
1356                          */
1357                         vm_page_protect(p, VM_PROT_NONE);
1358                         vm_page_free(p);
1359                         return(0);
1360                 }
1361
1362                 /*
1363                  * Page does not exist in parent, rename the
1364                  * page from the backing object to the main object. 
1365                  *
1366                  * If the page was mapped to a process, it can remain 
1367                  * mapped through the rename.
1368                  */
1369                 if ((p->queue - p->pc) == PQ_CACHE)
1370                         vm_page_deactivate(p);
1371
1372                 vm_page_rename(p, object, new_pindex);
1373                 /* page automatically made dirty by rename */
1374         }
1375         return(0);
1376 }
1377
1378 /*
1379  * This version of collapse allows the operation to occur earlier and
1380  * when paging_in_progress is true for an object...  This is not a complete
1381  * operation, but should plug 99.9% of the rest of the leaks.
1382  *
1383  * The caller must hold vm_token and vmobj_token.
1384  * (only called from vm_object_collapse)
1385  */
1386 static void
1387 vm_object_qcollapse(vm_object_t object)
1388 {
1389         vm_object_t backing_object = object->backing_object;
1390
1391         if (backing_object->ref_count != 1)
1392                 return;
1393
1394         backing_object->ref_count += 2;
1395
1396         vm_object_backing_scan(object, OBSC_COLLAPSE_NOWAIT);
1397
1398         backing_object->ref_count -= 2;
1399 }
1400
1401 /*
1402  * Collapse an object with the object backing it.  Pages in the backing
1403  * object are moved into the parent, and the backing object is deallocated.
1404  */
1405 void
1406 vm_object_collapse(vm_object_t object)
1407 {
1408         ASSERT_LWKT_TOKEN_HELD(&vm_token);
1409         ASSERT_LWKT_TOKEN_HELD(&vmobj_token);
1410
1411         while (TRUE) {
1412                 vm_object_t backing_object;
1413
1414                 /*
1415                  * Verify that the conditions are right for collapse:
1416                  *
1417                  * The object exists and the backing object exists.
1418                  */
1419                 if (object == NULL)
1420                         break;
1421
1422                 if ((backing_object = object->backing_object) == NULL)
1423                         break;
1424
1425                 /*
1426                  * we check the backing object first, because it is most likely
1427                  * not collapsable.
1428                  */
1429                 if (backing_object->handle != NULL ||
1430                     (backing_object->type != OBJT_DEFAULT &&
1431                      backing_object->type != OBJT_SWAP) ||
1432                     (backing_object->flags & OBJ_DEAD) ||
1433                     object->handle != NULL ||
1434                     (object->type != OBJT_DEFAULT &&
1435                      object->type != OBJT_SWAP) ||
1436                     (object->flags & OBJ_DEAD)) {
1437                         break;
1438                 }
1439
1440                 if (
1441                     object->paging_in_progress != 0 ||
1442                     backing_object->paging_in_progress != 0
1443                 ) {
1444                         vm_object_qcollapse(object);
1445                         break;
1446                 }
1447
1448                 /*
1449                  * We know that we can either collapse the backing object (if
1450                  * the parent is the only reference to it) or (perhaps) have
1451                  * the parent bypass the object if the parent happens to shadow
1452                  * all the resident pages in the entire backing object.
1453                  *
1454                  * This is ignoring pager-backed pages such as swap pages.
1455                  * vm_object_backing_scan fails the shadowing test in this
1456                  * case.
1457                  */
1458
1459                 if (backing_object->ref_count == 1) {
1460                         /*
1461                          * If there is exactly one reference to the backing
1462                          * object, we can collapse it into the parent.  
1463                          */
1464                         vm_object_backing_scan(object, OBSC_COLLAPSE_WAIT);
1465
1466                         /*
1467                          * Move the pager from backing_object to object.
1468                          */
1469
1470                         if (backing_object->type == OBJT_SWAP) {
1471                                 vm_object_pip_add(backing_object, 1);
1472
1473                                 /*
1474                                  * scrap the paging_offset junk and do a 
1475                                  * discrete copy.  This also removes major 
1476                                  * assumptions about how the swap-pager 
1477                                  * works from where it doesn't belong.  The
1478                                  * new swapper is able to optimize the
1479                                  * destroy-source case.
1480                                  */
1481
1482                                 vm_object_pip_add(object, 1);
1483                                 swap_pager_copy(
1484                                     backing_object,
1485                                     object,
1486                                     OFF_TO_IDX(object->backing_object_offset), TRUE);
1487                                 vm_object_pip_wakeup(object);
1488
1489                                 vm_object_pip_wakeup(backing_object);
1490                         }
1491                         /*
1492                          * Object now shadows whatever backing_object did.
1493                          * Note that the reference to 
1494                          * backing_object->backing_object moves from within 
1495                          * backing_object to within object.
1496                          */
1497
1498                         LIST_REMOVE(object, shadow_list);
1499                         object->backing_object->shadow_count--;
1500                         object->backing_object->generation++;
1501                         if (backing_object->backing_object) {
1502                                 LIST_REMOVE(backing_object, shadow_list);
1503                                 backing_object->backing_object->shadow_count--;
1504                                 backing_object->backing_object->generation++;
1505                         }
1506                         object->backing_object = backing_object->backing_object;
1507                         if (object->backing_object) {
1508                                 LIST_INSERT_HEAD(
1509                                     &object->backing_object->shadow_head,
1510                                     object, 
1511                                     shadow_list
1512                                 );
1513                                 object->backing_object->shadow_count++;
1514                                 object->backing_object->generation++;
1515                         }
1516
1517                         object->backing_object_offset +=
1518                             backing_object->backing_object_offset;
1519
1520                         /*
1521                          * Discard backing_object.
1522                          *
1523                          * Since the backing object has no pages, no pager left,
1524                          * and no object references within it, all that is
1525                          * necessary is to dispose of it.
1526                          */
1527
1528                         KASSERT(backing_object->ref_count == 1,
1529                                 ("backing_object %p was somehow "
1530                                  "re-referenced during collapse!",
1531                                  backing_object));
1532                         KASSERT(RB_EMPTY(&backing_object->rb_memq),
1533                                 ("backing_object %p somehow has left "
1534                                  "over pages during collapse!",
1535                                  backing_object));
1536
1537                         /*
1538                          * Wait for hold count to hit zero
1539                          */
1540                         vm_object_hold_wait(backing_object);
1541
1542                         /* (we are holding vmobj_token) */
1543                         TAILQ_REMOVE(&vm_object_list, backing_object,
1544                                      object_list);
1545                         vm_object_count--;
1546
1547                         zfree(obj_zone, backing_object);
1548
1549                         object_collapses++;
1550                 } else {
1551                         vm_object_t new_backing_object;
1552
1553                         /*
1554                          * If we do not entirely shadow the backing object,
1555                          * there is nothing we can do so we give up.
1556                          */
1557
1558                         if (vm_object_backing_scan(object, OBSC_TEST_ALL_SHADOWED) == 0) {
1559                                 break;
1560                         }
1561
1562                         /*
1563                          * Make the parent shadow the next object in the
1564                          * chain.  Deallocating backing_object will not remove
1565                          * it, since its reference count is at least 2.
1566                          */
1567
1568                         LIST_REMOVE(object, shadow_list);
1569                         backing_object->shadow_count--;
1570                         backing_object->generation++;
1571
1572                         new_backing_object = backing_object->backing_object;
1573                         if ((object->backing_object = new_backing_object) != NULL) {
1574                                 vm_object_reference(new_backing_object);
1575                                 LIST_INSERT_HEAD(
1576                                     &new_backing_object->shadow_head,
1577                                     object,
1578                                     shadow_list
1579                                 );
1580                                 new_backing_object->shadow_count++;
1581                                 new_backing_object->generation++;
1582                                 object->backing_object_offset +=
1583                                         backing_object->backing_object_offset;
1584                         }
1585
1586                         /*
1587                          * Drop the reference count on backing_object. Since
1588                          * its ref_count was at least 2, it will not vanish;
1589                          * so we don't need to call vm_object_deallocate, but
1590                          * we do anyway.
1591                          */
1592                         vm_object_deallocate_locked(backing_object);
1593                         object_bypasses++;
1594                 }
1595
1596                 /*
1597                  * Try again with this object's new backing object.
1598                  */
1599         }
1600 }
1601
1602 /*
1603  * Removes all physical pages in the specified object range from the
1604  * object's list of pages.
1605  *
1606  * No requirements.
1607  */
1608 static int vm_object_page_remove_callback(vm_page_t p, void *data);
1609
1610 void
1611 vm_object_page_remove(vm_object_t object, vm_pindex_t start, vm_pindex_t end,
1612                       boolean_t clean_only)
1613 {
1614         struct rb_vm_page_scan_info info;
1615         int all;
1616
1617         /*
1618          * Degenerate cases and assertions
1619          */
1620         lwkt_gettoken(&vm_token);
1621         if (object == NULL ||
1622             (object->resident_page_count == 0 && object->swblock_count == 0)) {
1623                 lwkt_reltoken(&vm_token);
1624                 return;
1625         }
1626         KASSERT(object->type != OBJT_PHYS, 
1627                 ("attempt to remove pages from a physical object"));
1628
1629         /*
1630          * Indicate that paging is occuring on the object
1631          */
1632         crit_enter();
1633         vm_object_pip_add(object, 1);
1634
1635         /*
1636          * Figure out the actual removal range and whether we are removing
1637          * the entire contents of the object or not.  If removing the entire
1638          * contents, be sure to get all pages, even those that might be 
1639          * beyond the end of the object.
1640          */
1641         info.start_pindex = start;
1642         if (end == 0)
1643                 info.end_pindex = (vm_pindex_t)-1;
1644         else
1645                 info.end_pindex = end - 1;
1646         info.limit = clean_only;
1647         all = (start == 0 && info.end_pindex >= object->size - 1);
1648
1649         /*
1650          * Loop until we are sure we have gotten them all.
1651          */
1652         do {
1653                 info.error = 0;
1654                 vm_page_rb_tree_RB_SCAN(&object->rb_memq, rb_vm_page_scancmp,
1655                                         vm_object_page_remove_callback, &info);
1656         } while (info.error);
1657
1658         /*
1659          * Remove any related swap if throwing away pages, or for
1660          * non-swap objects (the swap is a clean copy in that case).
1661          */
1662         if (object->type != OBJT_SWAP || clean_only == FALSE) {
1663                 if (all)
1664                         swap_pager_freespace_all(object);
1665                 else
1666                         swap_pager_freespace(object, info.start_pindex,
1667                              info.end_pindex - info.start_pindex + 1);
1668         }
1669
1670         /*
1671          * Cleanup
1672          */
1673         vm_object_pip_wakeup(object);
1674         crit_exit();
1675         lwkt_reltoken(&vm_token);
1676 }
1677
1678 /*
1679  * The caller must hold vm_token.
1680  */
1681 static int
1682 vm_object_page_remove_callback(vm_page_t p, void *data)
1683 {
1684         struct rb_vm_page_scan_info *info = data;
1685
1686         /*
1687          * Wired pages cannot be destroyed, but they can be invalidated
1688          * and we do so if clean_only (limit) is not set.
1689          *
1690          * WARNING!  The page may be wired due to being part of a buffer
1691          *           cache buffer, and the buffer might be marked B_CACHE.
1692          *           This is fine as part of a truncation but VFSs must be
1693          *           sure to fix the buffer up when re-extending the file.
1694          */
1695         if (p->wire_count != 0) {
1696                 vm_page_protect(p, VM_PROT_NONE);
1697                 if (info->limit == 0)
1698                         p->valid = 0;
1699                 return(0);
1700         }
1701
1702         /*
1703          * The busy flags are only cleared at
1704          * interrupt -- minimize the spl transitions
1705          */
1706
1707         if (vm_page_sleep_busy(p, TRUE, "vmopar")) {
1708                 info->error = 1;
1709                 return(0);
1710         }
1711
1712         /*
1713          * limit is our clean_only flag.  If set and the page is dirty, do
1714          * not free it.  If set and the page is being held by someone, do
1715          * not free it.
1716          */
1717         if (info->limit && p->valid) {
1718                 vm_page_test_dirty(p);
1719                 if (p->valid & p->dirty)
1720                         return(0);
1721                 if (p->hold_count)
1722                         return(0);
1723         }
1724
1725         /*
1726          * Destroy the page
1727          */
1728         vm_page_busy(p);
1729         vm_page_protect(p, VM_PROT_NONE);
1730         vm_page_free(p);
1731         return(0);
1732 }
1733
1734 /*
1735  * Coalesces two objects backing up adjoining regions of memory into a
1736  * single object.
1737  *
1738  * returns TRUE if objects were combined.
1739  *
1740  * NOTE: Only works at the moment if the second object is NULL -
1741  *       if it's not, which object do we lock first?
1742  *
1743  * Parameters:
1744  *      prev_object     First object to coalesce
1745  *      prev_offset     Offset into prev_object
1746  *      next_object     Second object into coalesce
1747  *      next_offset     Offset into next_object
1748  *
1749  *      prev_size       Size of reference to prev_object
1750  *      next_size       Size of reference to next_object
1751  *
1752  * The object must not be locked.
1753  * The caller must hold vm_token and vmobj_token.
1754  */
1755 boolean_t
1756 vm_object_coalesce(vm_object_t prev_object, vm_pindex_t prev_pindex,
1757                    vm_size_t prev_size, vm_size_t next_size)
1758 {
1759         vm_pindex_t next_pindex;
1760
1761         ASSERT_LWKT_TOKEN_HELD(&vm_token);
1762         ASSERT_LWKT_TOKEN_HELD(&vmobj_token);
1763
1764         if (prev_object == NULL) {
1765                 return (TRUE);
1766         }
1767
1768         if (prev_object->type != OBJT_DEFAULT &&
1769             prev_object->type != OBJT_SWAP) {
1770                 return (FALSE);
1771         }
1772
1773         /*
1774          * Try to collapse the object first
1775          */
1776         vm_object_collapse(prev_object);
1777
1778         /*
1779          * Can't coalesce if: . more than one reference . paged out . shadows
1780          * another object . has a copy elsewhere (any of which mean that the
1781          * pages not mapped to prev_entry may be in use anyway)
1782          */
1783
1784         if (prev_object->backing_object != NULL) {
1785                 return (FALSE);
1786         }
1787
1788         prev_size >>= PAGE_SHIFT;
1789         next_size >>= PAGE_SHIFT;
1790         next_pindex = prev_pindex + prev_size;
1791
1792         if ((prev_object->ref_count > 1) &&
1793             (prev_object->size != next_pindex)) {
1794                 return (FALSE);
1795         }
1796
1797         /*
1798          * Remove any pages that may still be in the object from a previous
1799          * deallocation.
1800          */
1801         if (next_pindex < prev_object->size) {
1802                 vm_object_page_remove(prev_object,
1803                                       next_pindex,
1804                                       next_pindex + next_size, FALSE);
1805                 if (prev_object->type == OBJT_SWAP)
1806                         swap_pager_freespace(prev_object,
1807                                              next_pindex, next_size);
1808         }
1809
1810         /*
1811          * Extend the object if necessary.
1812          */
1813         if (next_pindex + next_size > prev_object->size)
1814                 prev_object->size = next_pindex + next_size;
1815
1816         return (TRUE);
1817 }
1818
1819 /*
1820  * Make the object writable and flag is being possibly dirty.
1821  *
1822  * No requirements.
1823  */
1824 void
1825 vm_object_set_writeable_dirty(vm_object_t object)
1826 {
1827         struct vnode *vp;
1828
1829         lwkt_gettoken(&vm_token);
1830         vm_object_set_flag(object, OBJ_WRITEABLE|OBJ_MIGHTBEDIRTY);
1831         if (object->type == OBJT_VNODE &&
1832             (vp = (struct vnode *)object->handle) != NULL) {
1833                 if ((vp->v_flag & VOBJDIRTY) == 0) {
1834                         vsetflags(vp, VOBJDIRTY);
1835                 }
1836         }
1837         lwkt_reltoken(&vm_token);
1838 }
1839
1840 static void
1841 vm_object_lock_init(vm_object_t obj)
1842 {
1843 #if defined(DEBUG_LOCKS)
1844         int i;
1845
1846         obj->debug_hold_bitmap = 0;
1847         obj->debug_hold_ovfl = 0;
1848         for (i = 0; i < VMOBJ_DEBUG_ARRAY_SIZE; i++) {
1849                 obj->debug_hold_thrs[i] = NULL;
1850         }
1851 #endif
1852 }
1853
1854 void
1855 vm_object_lock(vm_object_t obj)
1856 {
1857         lwkt_getpooltoken(obj);
1858 }
1859
1860 void
1861 vm_object_unlock(vm_object_t obj)
1862 {
1863         lwkt_relpooltoken(obj);
1864 }
1865
1866 void
1867 vm_object_hold(vm_object_t obj)
1868 {
1869         vm_object_lock(obj);
1870
1871         refcount_acquire(&obj->hold_count);
1872
1873 #if defined(DEBUG_LOCKS)
1874         int i;
1875
1876         i = ffs(~obj->debug_hold_bitmap) - 1;
1877         if (i == -1) {
1878                 kprintf("vm_object hold count > VMOBJ_DEBUG_ARRAY_SIZE");
1879                 obj->debug_hold_ovfl = 1;
1880         }
1881
1882         obj->debug_hold_bitmap |= (1 << i);
1883         obj->debug_hold_thrs[i] = curthread;
1884 #endif
1885 }
1886
1887 void
1888 vm_object_drop(vm_object_t obj)
1889 {
1890         int rc;
1891
1892 #if defined(DEBUG_LOCKS)
1893         int found = 0;
1894         int i;
1895
1896         for (i = 0; i < VMOBJ_DEBUG_ARRAY_SIZE; i++) {
1897                 if ((obj->debug_hold_bitmap & (1 << i)) &&
1898                     (obj->debug_hold_thrs[i] == curthread)) {
1899                         obj->debug_hold_bitmap &= ~(1 << i);
1900                         obj->debug_hold_thrs[i] = NULL;
1901                         found = 1;
1902                         break;
1903                 }
1904         }
1905
1906         if (found == 0 && obj->debug_hold_ovfl == 0)
1907                 panic("vm_object: attempt to drop hold on non-self-held obj");
1908 #endif
1909
1910         rc = refcount_release(&obj->hold_count);
1911         vm_object_unlock(obj);
1912
1913         if (rc) 
1914                 vm_object_hold_wake(obj);
1915 }
1916
1917 static void
1918 vm_object_hold_wake(vm_object_t obj)
1919 {
1920         wakeup(obj);
1921 }
1922
1923 static void
1924 vm_object_hold_wait(vm_object_t obj)
1925 {
1926         vm_object_lock(obj);
1927
1928 #if defined(DEBUG_LOCKS)
1929         int i;
1930
1931         for (i = 0; i < VMOBJ_DEBUG_ARRAY_SIZE; i++) {
1932                 if ((obj->debug_hold_bitmap & (1 << i)) &&
1933                     (obj->debug_hold_thrs[i] == curthread)) 
1934                         panic("vm_object: self-hold in terminate or collapse");
1935         }
1936 #endif
1937
1938         while (obj->hold_count)
1939                 tsleep(obj, 0, "vmobjhld", 0);
1940
1941         vm_object_unlock(obj);
1942 }
1943
1944 #include "opt_ddb.h"
1945 #ifdef DDB
1946 #include <sys/kernel.h>
1947
1948 #include <sys/cons.h>
1949
1950 #include <ddb/ddb.h>
1951
1952 static int      _vm_object_in_map (vm_map_t map, vm_object_t object,
1953                                        vm_map_entry_t entry);
1954 static int      vm_object_in_map (vm_object_t object);
1955
1956 /*
1957  * The caller must hold vm_token.
1958  */
1959 static int
1960 _vm_object_in_map(vm_map_t map, vm_object_t object, vm_map_entry_t entry)
1961 {
1962         vm_map_t tmpm;
1963         vm_map_entry_t tmpe;
1964         vm_object_t obj;
1965         int entcount;
1966
1967         if (map == 0)
1968                 return 0;
1969         if (entry == 0) {
1970                 tmpe = map->header.next;
1971                 entcount = map->nentries;
1972                 while (entcount-- && (tmpe != &map->header)) {
1973                         if( _vm_object_in_map(map, object, tmpe)) {
1974                                 return 1;
1975                         }
1976                         tmpe = tmpe->next;
1977                 }
1978                 return (0);
1979         }
1980         switch(entry->maptype) {
1981         case VM_MAPTYPE_SUBMAP:
1982                 tmpm = entry->object.sub_map;
1983                 tmpe = tmpm->header.next;
1984                 entcount = tmpm->nentries;
1985                 while (entcount-- && tmpe != &tmpm->header) {
1986                         if( _vm_object_in_map(tmpm, object, tmpe)) {
1987                                 return 1;
1988                         }
1989                         tmpe = tmpe->next;
1990                 }
1991                 break;
1992         case VM_MAPTYPE_NORMAL:
1993         case VM_MAPTYPE_VPAGETABLE:
1994                 obj = entry->object.vm_object;
1995                 while (obj) {
1996                         if (obj == object)
1997                                 return 1;
1998                         obj = obj->backing_object;
1999                 }
2000                 break;
2001         default:
2002                 break;
2003         }
2004         return 0;
2005 }
2006
2007 static int vm_object_in_map_callback(struct proc *p, void *data);
2008
2009 struct vm_object_in_map_info {
2010         vm_object_t object;
2011         int rv;
2012 };
2013
2014 /*
2015  * Debugging only
2016  */
2017 static int
2018 vm_object_in_map(vm_object_t object)
2019 {
2020         struct vm_object_in_map_info info;
2021
2022         info.rv = 0;
2023         info.object = object;
2024
2025         allproc_scan(vm_object_in_map_callback, &info);
2026         if (info.rv)
2027                 return 1;
2028         if( _vm_object_in_map(&kernel_map, object, 0))
2029                 return 1;
2030         if( _vm_object_in_map(&pager_map, object, 0))
2031                 return 1;
2032         if( _vm_object_in_map(&buffer_map, object, 0))
2033                 return 1;
2034         return 0;
2035 }
2036
2037 /*
2038  * Debugging only
2039  */
2040 static int
2041 vm_object_in_map_callback(struct proc *p, void *data)
2042 {
2043         struct vm_object_in_map_info *info = data;
2044
2045         if (p->p_vmspace) {
2046                 if (_vm_object_in_map(&p->p_vmspace->vm_map, info->object, 0)) {
2047                         info->rv = 1;
2048                         return -1;
2049                 }
2050         }
2051         return (0);
2052 }
2053
2054 DB_SHOW_COMMAND(vmochk, vm_object_check)
2055 {
2056         vm_object_t object;
2057
2058         /*
2059          * make sure that internal objs are in a map somewhere
2060          * and none have zero ref counts.
2061          */
2062         for (object = TAILQ_FIRST(&vm_object_list);
2063                         object != NULL;
2064                         object = TAILQ_NEXT(object, object_list)) {
2065                 if (object->type == OBJT_MARKER)
2066                         continue;
2067                 if (object->handle == NULL &&
2068                     (object->type == OBJT_DEFAULT || object->type == OBJT_SWAP)) {
2069                         if (object->ref_count == 0) {
2070                                 db_printf("vmochk: internal obj has zero ref count: %ld\n",
2071                                         (long)object->size);
2072                         }
2073                         if (!vm_object_in_map(object)) {
2074                                 db_printf(
2075                         "vmochk: internal obj is not in a map: "
2076                         "ref: %d, size: %lu: 0x%lx, backing_object: %p\n",
2077                                     object->ref_count, (u_long)object->size, 
2078                                     (u_long)object->size,
2079                                     (void *)object->backing_object);
2080                         }
2081                 }
2082         }
2083 }
2084
2085 /*
2086  * Debugging only
2087  */
2088 DB_SHOW_COMMAND(object, vm_object_print_static)
2089 {
2090         /* XXX convert args. */
2091         vm_object_t object = (vm_object_t)addr;
2092         boolean_t full = have_addr;
2093
2094         vm_page_t p;
2095
2096         /* XXX count is an (unused) arg.  Avoid shadowing it. */
2097 #define count   was_count
2098
2099         int count;
2100
2101         if (object == NULL)
2102                 return;
2103
2104         db_iprintf(
2105             "Object %p: type=%d, size=0x%lx, res=%d, ref=%d, flags=0x%x\n",
2106             object, (int)object->type, (u_long)object->size,
2107             object->resident_page_count, object->ref_count, object->flags);
2108         /*
2109          * XXX no %qd in kernel.  Truncate object->backing_object_offset.
2110          */
2111         db_iprintf(" sref=%d, backing_object(%d)=(%p)+0x%lx\n",
2112             object->shadow_count, 
2113             object->backing_object ? object->backing_object->ref_count : 0,
2114             object->backing_object, (long)object->backing_object_offset);
2115
2116         if (!full)
2117                 return;
2118
2119         db_indent += 2;
2120         count = 0;
2121         RB_FOREACH(p, vm_page_rb_tree, &object->rb_memq) {
2122                 if (count == 0)
2123                         db_iprintf("memory:=");
2124                 else if (count == 6) {
2125                         db_printf("\n");
2126                         db_iprintf(" ...");
2127                         count = 0;
2128                 } else
2129                         db_printf(",");
2130                 count++;
2131
2132                 db_printf("(off=0x%lx,page=0x%lx)",
2133                     (u_long) p->pindex, (u_long) VM_PAGE_TO_PHYS(p));
2134         }
2135         if (count != 0)
2136                 db_printf("\n");
2137         db_indent -= 2;
2138 }
2139
2140 /* XXX. */
2141 #undef count
2142
2143 /*
2144  * XXX need this non-static entry for calling from vm_map_print.
2145  *
2146  * Debugging only
2147  */
2148 void
2149 vm_object_print(/* db_expr_t */ long addr,
2150                 boolean_t have_addr,
2151                 /* db_expr_t */ long count,
2152                 char *modif)
2153 {
2154         vm_object_print_static(addr, have_addr, count, modif);
2155 }
2156
2157 /*
2158  * Debugging only
2159  */
2160 DB_SHOW_COMMAND(vmopag, vm_object_print_pages)
2161 {
2162         vm_object_t object;
2163         int nl = 0;
2164         int c;
2165         for (object = TAILQ_FIRST(&vm_object_list);
2166                         object != NULL;
2167                         object = TAILQ_NEXT(object, object_list)) {
2168                 vm_pindex_t idx, fidx;
2169                 vm_pindex_t osize;
2170                 vm_paddr_t pa = -1, padiff;
2171                 int rcount;
2172                 vm_page_t m;
2173
2174                 if (object->type == OBJT_MARKER)
2175                         continue;
2176                 db_printf("new object: %p\n", (void *)object);
2177                 if ( nl > 18) {
2178                         c = cngetc();
2179                         if (c != ' ')
2180                                 return;
2181                         nl = 0;
2182                 }
2183                 nl++;
2184                 rcount = 0;
2185                 fidx = 0;
2186                 osize = object->size;
2187                 if (osize > 128)
2188                         osize = 128;
2189                 for (idx = 0; idx < osize; idx++) {
2190                         m = vm_page_lookup(object, idx);
2191                         if (m == NULL) {
2192                                 if (rcount) {
2193                                         db_printf(" index(%ld)run(%d)pa(0x%lx)\n",
2194                                                 (long)fidx, rcount, (long)pa);
2195                                         if ( nl > 18) {
2196                                                 c = cngetc();
2197                                                 if (c != ' ')
2198                                                         return;
2199                                                 nl = 0;
2200                                         }
2201                                         nl++;
2202                                         rcount = 0;
2203                                 }
2204                                 continue;
2205                         }
2206
2207                                 
2208                         if (rcount &&
2209                                 (VM_PAGE_TO_PHYS(m) == pa + rcount * PAGE_SIZE)) {
2210                                 ++rcount;
2211                                 continue;
2212                         }
2213                         if (rcount) {
2214                                 padiff = pa + rcount * PAGE_SIZE - VM_PAGE_TO_PHYS(m);
2215                                 padiff >>= PAGE_SHIFT;
2216                                 padiff &= PQ_L2_MASK;
2217                                 if (padiff == 0) {
2218                                         pa = VM_PAGE_TO_PHYS(m) - rcount * PAGE_SIZE;
2219                                         ++rcount;
2220                                         continue;
2221                                 }
2222                                 db_printf(" index(%ld)run(%d)pa(0x%lx)",
2223                                         (long)fidx, rcount, (long)pa);
2224                                 db_printf("pd(%ld)\n", (long)padiff);
2225                                 if ( nl > 18) {
2226                                         c = cngetc();
2227                                         if (c != ' ')
2228                                                 return;
2229                                         nl = 0;
2230                                 }
2231                                 nl++;
2232                         }
2233                         fidx = idx;
2234                         pa = VM_PAGE_TO_PHYS(m);
2235                         rcount = 1;
2236                 }
2237                 if (rcount) {
2238                         db_printf(" index(%ld)run(%d)pa(0x%lx)\n",
2239                                 (long)fidx, rcount, (long)pa);
2240                         if ( nl > 18) {
2241                                 c = cngetc();
2242                                 if (c != ' ')
2243                                         return;
2244                                 nl = 0;
2245                         }
2246                         nl++;
2247                 }
2248         }
2249 }
2250 #endif /* DDB */