Module Name:    src
Committed By:   matt
Date:           Wed Feb 29 18:03:40 UTC 2012

Modified Files:
        src/sys/miscfs/genfs [matt-nb5-mips64]: genfs_io.c
        src/sys/uvm [matt-nb5-mips64]: files.uvm uvm.h uvm_amap.c uvm_aobj.c
            uvm_bio.c uvm_fault.c uvm_km.c uvm_loan.c uvm_map.c uvm_page.c
            uvm_page.h uvm_pdaemon.c uvm_pglist.c uvm_vnode.c

Log Message:
Improve UVM_PAGE_TRKOWN.
Add more asserts to uvm_page.


To generate a diff of this commit:
cvs rdiff -u -r1.13.4.2.4.4 -r1.13.4.2.4.5 src/sys/miscfs/genfs/genfs_io.c
cvs rdiff -u -r1.11 -r1.11.12.1 src/sys/uvm/files.uvm
cvs rdiff -u -r1.55.16.3 -r1.55.16.4 src/sys/uvm/uvm.h
cvs rdiff -u -r1.84.20.1.4.1 -r1.84.20.1.4.2 src/sys/uvm/uvm_amap.c
cvs rdiff -u -r1.104.10.2 -r1.104.10.3 src/sys/uvm/uvm_aobj.c
cvs rdiff -u -r1.65 -r1.65.14.1 src/sys/uvm/uvm_bio.c
cvs rdiff -u -r1.125.6.1.4.3 -r1.125.6.1.4.4 src/sys/uvm/uvm_fault.c
cvs rdiff -u -r1.101.4.2.4.8 -r1.101.4.2.4.9 src/sys/uvm/uvm_km.c
cvs rdiff -u -r1.72 -r1.72.10.1 src/sys/uvm/uvm_loan.c
cvs rdiff -u -r1.263.4.3.4.7 -r1.263.4.3.4.8 src/sys/uvm/uvm_map.c
cvs rdiff -u -r1.140.6.3.4.9 -r1.140.6.3.4.10 src/sys/uvm/uvm_page.c
cvs rdiff -u -r1.55.14.8 -r1.55.14.9 src/sys/uvm/uvm_page.h
cvs rdiff -u -r1.93.4.2.4.7 -r1.93.4.2.4.8 src/sys/uvm/uvm_pdaemon.c
cvs rdiff -u -r1.42.16.12 -r1.42.16.13 src/sys/uvm/uvm_pglist.c
cvs rdiff -u -r1.90.28.3 -r1.90.28.4 src/sys/uvm/uvm_vnode.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.13.4.2.4.4 src/sys/miscfs/genfs/genfs_io.c:1.13.4.2.4.5
--- src/sys/miscfs/genfs/genfs_io.c:1.13.4.2.4.4	Thu Feb  9 03:08:31 2012
+++ src/sys/miscfs/genfs/genfs_io.c	Wed Feb 29 18:03:37 2012
@@ -693,7 +693,7 @@ out:
 			}
 			uvm_pageenqueue(pg);
 			pg->flags &= ~(PG_WANTED|PG_BUSY|PG_FAKE);
-			UVM_PAGE_OWN(pg, NULL);
+			UVM_PAGE_OWN(pg, NULL, NULL);
 		}
 	}
 	mutex_exit(&uvm_pageqlock);
@@ -1037,7 +1037,7 @@ retry:
 			wasclean = false;
 			memset(pgs, 0, sizeof(pgs));
 			pg->flags |= PG_BUSY;
-			UVM_PAGE_OWN(pg, "genfs_putpages");
+			UVM_PAGE_OWN(pg, "genfs_putpages", NULL);
 
 			/*
 			 * first look backward.
@@ -1115,6 +1115,7 @@ retry:
 					 */
 
 					nextpg = TAILQ_NEXT(tpg, listq.queue);
+					uvm_pagedequeue(tpg);
 					uvm_pagefree(tpg);
 					if (pagedaemon) {
 						uvm_page_to_pggroup(tpg)->pgrp_pdfreed++;

Index: src/sys/uvm/files.uvm
diff -u src/sys/uvm/files.uvm:1.11 src/sys/uvm/files.uvm:1.11.12.1
--- src/sys/uvm/files.uvm:1.11	Wed Jun  4 17:47:40 2008
+++ src/sys/uvm/files.uvm	Wed Feb 29 18:03:38 2012
@@ -1,10 +1,10 @@
-#	$NetBSD: files.uvm,v 1.11 2008/06/04 17:47:40 ad Exp $
+#	$NetBSD: files.uvm,v 1.11.12.1 2012/02/29 18:03:38 matt Exp $
 
 #
 # UVM options
 # 
 defflag opt_uvmhist.h		UVMHIST UVMHIST_PRINT
-defflag opt_uvm.h		USE_TOPDOWN_VM UVMMAP_COUNTERS
+defflag opt_uvm.h		USE_TOPDOWN_VM UVMMAP_COUNTERS UVM_PAGE_TRKOWN
 defflag opt_vmswap.h		VMSWAP
 defflag opt_readahead.h		READAHEAD_STATS
 defflag opt_ubc.h		UBC_STATS

Index: src/sys/uvm/uvm.h
diff -u src/sys/uvm/uvm.h:1.55.16.3 src/sys/uvm/uvm.h:1.55.16.4
--- src/sys/uvm/uvm.h:1.55.16.3	Thu Feb  9 03:04:59 2012
+++ src/sys/uvm/uvm.h	Wed Feb 29 18:03:38 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm.h,v 1.55.16.3 2012/02/09 03:04:59 matt Exp $	*/
+/*	$NetBSD: uvm.h,v 1.55.16.4 2012/02/29 18:03:38 matt Exp $	*/
 
 /*
  *
@@ -204,9 +204,9 @@ void uvm_kick_pdaemon(void);
  */
 
 #if defined(UVM_PAGE_TRKOWN)
-#define UVM_PAGE_OWN(PG, TAG) uvm_page_own(PG, TAG)
+#define UVM_PAGE_OWN(PG, TAG, ADDR) uvm_page_own(PG, TAG, ADDR)
 #else
-#define UVM_PAGE_OWN(PG, TAG) /* nothing */
+#define UVM_PAGE_OWN(PG, TAG, ADDR) /* nothing */
 #endif /* UVM_PAGE_TRKOWN */
 
 #include <uvm/uvm_fault_i.h>

Index: src/sys/uvm/uvm_amap.c
diff -u src/sys/uvm/uvm_amap.c:1.84.20.1.4.1 src/sys/uvm/uvm_amap.c:1.84.20.1.4.2
--- src/sys/uvm/uvm_amap.c:1.84.20.1.4.1	Thu Feb  9 03:04:59 2012
+++ src/sys/uvm/uvm_amap.c	Wed Feb 29 18:03:38 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_amap.c,v 1.84.20.1.4.1 2012/02/09 03:04:59 matt Exp $	*/
+/*	$NetBSD: uvm_amap.c,v 1.84.20.1.4.2 2012/02/29 18:03:38 matt Exp $	*/
 
 /*
  *
@@ -42,7 +42,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_amap.c,v 1.84.20.1.4.1 2012/02/09 03:04:59 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_amap.c,v 1.84.20.1.4.2 2012/02/29 18:03:38 matt Exp $");
 
 #include "opt_uvmhist.h"
 
@@ -1039,7 +1039,7 @@ ReStart:
 		uvm_pageactivate(npg);
 		mutex_exit(&uvm_pageqlock);
 		npg->flags &= ~(PG_BUSY|PG_FAKE);
-		UVM_PAGE_OWN(npg, NULL);
+		UVM_PAGE_OWN(npg, NULL, NULL);
 		mutex_exit(&nanon->an_lock);
 		mutex_exit(&anon->an_lock);
 	}

Index: src/sys/uvm/uvm_aobj.c
diff -u src/sys/uvm/uvm_aobj.c:1.104.10.2 src/sys/uvm/uvm_aobj.c:1.104.10.3
--- src/sys/uvm/uvm_aobj.c:1.104.10.2	Fri Jun  3 07:59:57 2011
+++ src/sys/uvm/uvm_aobj.c	Wed Feb 29 18:03:38 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_aobj.c,v 1.104.10.2 2011/06/03 07:59:57 matt Exp $	*/
+/*	$NetBSD: uvm_aobj.c,v 1.104.10.3 2012/02/29 18:03:38 matt Exp $	*/
 
 /*
  * Copyright (c) 1998 Chuck Silvers, Charles D. Cranor and
@@ -43,7 +43,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_aobj.c,v 1.104.10.2 2011/06/03 07:59:57 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_aobj.c,v 1.104.10.3 2012/02/29 18:03:38 matt Exp $");
 
 #include "opt_uvmhist.h"
 
@@ -1004,7 +1004,7 @@ uao_get(struct uvm_object *uobj, voff_t 
 
 			/* caller must un-busy this page */
 			ptmp->flags |= PG_BUSY;
-			UVM_PAGE_OWN(ptmp, "uao_get1");
+			UVM_PAGE_OWN(ptmp, "uao_get1", NULL);
 gotpage:
 			pps[lcv] = ptmp;
 			gotpages++;
@@ -1119,7 +1119,7 @@ gotpage:
 
 			/* we own it, caller must un-busy */
 			ptmp->flags |= PG_BUSY;
-			UVM_PAGE_OWN(ptmp, "uao_get2");
+			UVM_PAGE_OWN(ptmp, "uao_get2", NULL);
 			pps[lcv] = ptmp;
 		}
 
@@ -1466,7 +1466,7 @@ uao_pagein_page(struct uvm_aobj *aobj, i
 		wakeup(pg);
 	}
 	pg->flags &= ~(PG_WANTED|PG_BUSY|PG_CLEAN|PG_FAKE);
-	UVM_PAGE_OWN(pg, NULL);
+	UVM_PAGE_OWN(pg, NULL, NULL);
 
 	return false;
 }

Index: src/sys/uvm/uvm_bio.c
diff -u src/sys/uvm/uvm_bio.c:1.65 src/sys/uvm/uvm_bio.c:1.65.14.1
--- src/sys/uvm/uvm_bio.c:1.65	Mon May  5 17:11:17 2008
+++ src/sys/uvm/uvm_bio.c	Wed Feb 29 18:03:38 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_bio.c,v 1.65 2008/05/05 17:11:17 ad Exp $	*/
+/*	$NetBSD: uvm_bio.c,v 1.65.14.1 2012/02/29 18:03:38 matt Exp $	*/
 
 /*
  * Copyright (c) 1998 Chuck Silvers.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_bio.c,v 1.65 2008/05/05 17:11:17 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_bio.c,v 1.65.14.1 2012/02/29 18:03:38 matt Exp $");
 
 #include "opt_uvmhist.h"
 #include "opt_ubc.h"
@@ -389,7 +389,7 @@ again:
 		uvm_pageactivate(pg);
 		mutex_exit(&uvm_pageqlock);
 		pg->flags &= ~(PG_BUSY|PG_WANTED);
-		UVM_PAGE_OWN(pg, NULL);
+		UVM_PAGE_OWN(pg, NULL, NULL);
 		mutex_exit(&uobj->vmobjlock);
 		if (error) {
 			UVMHIST_LOG(ubchist, "pmap_enter fail %d",

Index: src/sys/uvm/uvm_fault.c
diff -u src/sys/uvm/uvm_fault.c:1.125.6.1.4.3 src/sys/uvm/uvm_fault.c:1.125.6.1.4.4
--- src/sys/uvm/uvm_fault.c:1.125.6.1.4.3	Fri Jun  3 07:59:57 2011
+++ src/sys/uvm/uvm_fault.c	Wed Feb 29 18:03:38 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_fault.c,v 1.125.6.1.4.3 2011/06/03 07:59:57 matt Exp $	*/
+/*	$NetBSD: uvm_fault.c,v 1.125.6.1.4.4 2012/02/29 18:03:38 matt Exp $	*/
 
 /*
  *
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.125.6.1.4.3 2011/06/03 07:59:57 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.125.6.1.4.4 2012/02/29 18:03:38 matt Exp $");
 
 #include "opt_uvmhist.h"
 
@@ -493,7 +493,7 @@ released:
 			uvm_pageactivate(pg);
 			mutex_exit(&uvm_pageqlock);
 			pg->flags &= ~(PG_WANTED|PG_BUSY|PG_FAKE);
-			UVM_PAGE_OWN(pg, NULL);
+			UVM_PAGE_OWN(pg, NULL, NULL);
 			if (!locked)
 				mutex_exit(&anon->an_lock);
 #else /* defined(VMSWAP) */
@@ -1138,7 +1138,7 @@ ReFault:
 				KASSERT((curpg->flags & PG_RELEASED) == 0);
 
 				curpg->flags &= ~(PG_BUSY);
-				UVM_PAGE_OWN(curpg, NULL);
+				UVM_PAGE_OWN(curpg, NULL, NULL);
 			}
 			pmap_update(ufi.orig_map->pmap);
 		}
@@ -1316,7 +1316,7 @@ ReFault:
 				mutex_exit(&uvm_pageqlock);
 
 				pg->flags &= ~(PG_BUSY|PG_FAKE);
-				UVM_PAGE_OWN(pg, NULL);
+				UVM_PAGE_OWN(pg, NULL, NULL);
 
 				/* done! */
 			}     /* ref == 1 */
@@ -1358,7 +1358,7 @@ ReFault:
 		uvm_pageactivate(pg);
 		mutex_exit(&uvm_pageqlock);
 		pg->flags &= ~(PG_BUSY|PG_FAKE);
-		UVM_PAGE_OWN(pg, NULL);
+		UVM_PAGE_OWN(pg, NULL, NULL);
 
 		/* deref: can not drop to zero here by defn! */
 		oanon->an_ref--;
@@ -1577,7 +1577,7 @@ Case2:
 				goto ReFault;
 			}
 			uobjpage->flags &= ~(PG_BUSY|PG_WANTED);
-			UVM_PAGE_OWN(uobjpage, NULL);
+			UVM_PAGE_OWN(uobjpage, NULL, NULL);
 			mutex_exit(&uobj->vmobjlock);
 			goto ReFault;
 		}
@@ -1656,7 +1656,7 @@ Case2:
 					if (uobjpage->flags & PG_WANTED)
 						wakeup(uobjpage);
 					uobjpage->flags &= ~(PG_BUSY|PG_WANTED);
-					UVM_PAGE_OWN(uobjpage, NULL);
+					UVM_PAGE_OWN(uobjpage, NULL, NULL);
 
 					uvmfault_unlockall(&ufi, amap, uobj,
 					  NULL);
@@ -1722,7 +1722,7 @@ Case2:
 				/* still have the obj lock */
 				wakeup(uobjpage);
 			uobjpage->flags &= ~(PG_BUSY|PG_WANTED);
-			UVM_PAGE_OWN(uobjpage, NULL);
+			UVM_PAGE_OWN(uobjpage, NULL, NULL);
 			mutex_exit(&uobj->vmobjlock);
 			uobj = NULL;
 
@@ -1788,7 +1788,7 @@ Case2:
 		KASSERT((pg->flags & PG_RELEASED) == 0);
 
 		pg->flags &= ~(PG_BUSY|PG_FAKE|PG_WANTED);
-		UVM_PAGE_OWN(pg, NULL);
+		UVM_PAGE_OWN(pg, NULL, NULL);
 		uvmfault_unlockall(&ufi, amap, uobj, anon);
 		if (!uvm_reclaimable()) {
 			UVMHIST_LOG(maphist,
@@ -1832,7 +1832,7 @@ Case2:
 	KASSERT((pg->flags & PG_RELEASED) == 0);
 
 	pg->flags &= ~(PG_BUSY|PG_FAKE|PG_WANTED);
-	UVM_PAGE_OWN(pg, NULL);
+	UVM_PAGE_OWN(pg, NULL, NULL);
 	uvmfault_unlockall(&ufi, amap, uobj, anon);
 	pmap_update(ufi.orig_map->pmap);
 	UVMHIST_LOG(maphist, "<- done (SUCCESS!)",0,0,0,0);

Index: src/sys/uvm/uvm_km.c
diff -u src/sys/uvm/uvm_km.c:1.101.4.2.4.8 src/sys/uvm/uvm_km.c:1.101.4.2.4.9
--- src/sys/uvm/uvm_km.c:1.101.4.2.4.8	Tue Feb 14 01:12:42 2012
+++ src/sys/uvm/uvm_km.c	Wed Feb 29 18:03:38 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_km.c,v 1.101.4.2.4.8 2012/02/14 01:12:42 matt Exp $	*/
+/*	$NetBSD: uvm_km.c,v 1.101.4.2.4.9 2012/02/29 18:03:38 matt Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -128,7 +128,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_km.c,v 1.101.4.2.4.8 2012/02/14 01:12:42 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_km.c,v 1.101.4.2.4.9 2012/02/29 18:03:38 matt Exp $");
 
 #include "opt_uvmhist.h"
 
@@ -632,7 +632,7 @@ uvm_km_alloc(struct vm_map *map, vsize_t
 		uvm_km_pageclaim(pg);
 
 		pg->flags &= ~PG_BUSY;	/* new page */
-		UVM_PAGE_OWN(pg, NULL);
+		UVM_PAGE_OWN(pg, NULL, NULL);
 
 		/*
 		 * map it in

Index: src/sys/uvm/uvm_loan.c
diff -u src/sys/uvm/uvm_loan.c:1.72 src/sys/uvm/uvm_loan.c:1.72.10.1
--- src/sys/uvm/uvm_loan.c:1.72	Tue Jun 17 02:29:10 2008
+++ src/sys/uvm/uvm_loan.c	Wed Feb 29 18:03:39 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_loan.c,v 1.72 2008/06/17 02:29:10 yamt Exp $	*/
+/*	$NetBSD: uvm_loan.c,v 1.72.10.1 2012/02/29 18:03:39 matt Exp $	*/
 
 /*
  *
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_loan.c,v 1.72 2008/06/17 02:29:10 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_loan.c,v 1.72.10.1 2012/02/29 18:03:39 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -724,7 +724,7 @@ uvm_loanuobj(struct uvm_faultinfo *ufi, 
 			uvm_pageactivate(pg);
 			mutex_exit(&uvm_pageqlock);
 			pg->flags &= ~(PG_BUSY|PG_WANTED);
-			UVM_PAGE_OWN(pg, NULL);
+			UVM_PAGE_OWN(pg, NULL, NULL);
 			mutex_exit(&uobj->vmobjlock);
 			return (0);
 		}
@@ -765,7 +765,7 @@ uvm_loanuobj(struct uvm_faultinfo *ufi, 
 			wakeup(pg);
 		}
 		pg->flags &= ~(PG_WANTED|PG_BUSY);
-		UVM_PAGE_OWN(pg, NULL);
+		UVM_PAGE_OWN(pg, NULL, NULL);
 		mutex_exit(&uobj->vmobjlock);
 		**output = anon;
 		(*output)++;
@@ -803,7 +803,7 @@ uvm_loanuobj(struct uvm_faultinfo *ufi, 
 		wakeup(pg);
 	}
 	pg->flags &= ~(PG_WANTED|PG_BUSY);
-	UVM_PAGE_OWN(pg, NULL);
+	UVM_PAGE_OWN(pg, NULL, NULL);
 	mutex_exit(&uobj->vmobjlock);
 	mutex_exit(&anon->an_lock);
 	**output = anon;
@@ -819,7 +819,7 @@ fail:
 		wakeup(pg);
 	}
 	pg->flags &= ~(PG_WANTED|PG_BUSY);
-	UVM_PAGE_OWN(pg, NULL);
+	UVM_PAGE_OWN(pg, NULL, NULL);
 	uvmfault_unlockall(ufi, amap, uobj, NULL);
 	return (-1);
 }
@@ -874,7 +874,7 @@ again:
 		mutex_enter(&uvm_pageqlock);
 		uvm_pageactivate(pg);
 		mutex_exit(&uvm_pageqlock);
-		UVM_PAGE_OWN(pg, NULL);
+		UVM_PAGE_OWN(pg, NULL, NULL);
 	}
 
 	if ((flags & UVM_LOAN_TOANON) == 0) {	/* loaning to kernel-page */
@@ -1148,7 +1148,7 @@ uvm_loanbreak(struct vm_page *uobjpage)
 		wakeup(uobjpage);
 	/* uobj still locked */
 	uobjpage->flags &= ~(PG_WANTED|PG_BUSY);
-	UVM_PAGE_OWN(uobjpage, NULL);
+	UVM_PAGE_OWN(uobjpage, NULL, NULL);
 
 	mutex_enter(&uvm_pageqlock);
 

Index: src/sys/uvm/uvm_map.c
diff -u src/sys/uvm/uvm_map.c:1.263.4.3.4.7 src/sys/uvm/uvm_map.c:1.263.4.3.4.8
--- src/sys/uvm/uvm_map.c:1.263.4.3.4.7	Thu Feb  9 03:04:59 2012
+++ src/sys/uvm/uvm_map.c	Wed Feb 29 18:03:39 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_map.c,v 1.263.4.3.4.7 2012/02/09 03:04:59 matt Exp $	*/
+/*	$NetBSD: uvm_map.c,v 1.263.4.3.4.8 2012/02/29 18:03:39 matt Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -71,7 +71,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.263.4.3.4.7 2012/02/09 03:04:59 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v 1.263.4.3.4.8 2012/02/29 18:03:39 matt Exp $");
 
 #include "opt_ddb.h"
 #include "opt_uvmhist.h"
@@ -2431,7 +2431,7 @@ uvm_unmap_remove(struct vm_map *map, vad
 			for (va = entry->start; va < entry->end;
 			    va += PAGE_SIZE) {
 				if (pmap_extract(vm_map_pmap(map), va, NULL)) {
-					panic("uvm_unmap_remove: has mapping");
+					panic("uvm_unmap_remove: entry %p (%#"PRIxVADDR"...%#"PRIxVADDR") has mapping at %#"PRIxVADDR, entry, entry->start, entry->end, va);
 				}
 			}
 
@@ -5069,10 +5069,10 @@ uvm_page_printit(struct vm_page *pg, boo
 	    pg->uobject, pg->uanon, (long long)pg->offset, pg->loan_count);
 #if defined(UVM_PAGE_TRKOWN)
 	if (pg->flags & PG_BUSY)
-		(*pr)("  owning process = %d, tag=%s\n",
-		    pg->owner, pg->owner_tag);
+		(*pr)("  owning process = %d, tag=%s, addr=%p\n",
+		    pg->owner, pg->owner_tag, pg->owner_addr);
 	else
-		(*pr)("  page not busy, no owner\n");
+		(*pr)("  page not busy, no owner (addr=%p)\n", pg->owner_addr);
 #else
 	(*pr)("  [page ownership tracking disabled]\n");
 #endif

Index: src/sys/uvm/uvm_page.c
diff -u src/sys/uvm/uvm_page.c:1.140.6.3.4.9 src/sys/uvm/uvm_page.c:1.140.6.3.4.10
--- src/sys/uvm/uvm_page.c:1.140.6.3.4.9	Thu Feb 16 04:20:45 2012
+++ src/sys/uvm/uvm_page.c	Wed Feb 29 18:03:39 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_page.c,v 1.140.6.3.4.9 2012/02/16 04:20:45 matt Exp $	*/
+/*	$NetBSD: uvm_page.c,v 1.140.6.3.4.10 2012/02/29 18:03:39 matt Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -71,7 +71,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.140.6.3.4.9 2012/02/16 04:20:45 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.140.6.3.4.10 2012/02/29 18:03:39 matt Exp $");
 
 #include "opt_uvmhist.h"
 #include "opt_readahead.h"
@@ -486,6 +486,19 @@ uvm_page_init(vaddr_t *kvm_startp, vaddr
 			}
 		}
 	}
+#if defined(DIAGNOSTIC)
+	for (u_int color = 0; color < uvmexp.ncolors; color++) {
+		for (u_int free_list = 0; free_list < VM_NFREELIST; free_list++) {
+			for (u_int queue = 0; queue < PGFL_NQUEUES; queue++) {
+				struct vm_page *pg;
+				KASSERT(LIST_FIRST(&uvm.page_free[color].pgfl_queues[free_list][queue]) == LIST_FIRST(&uvm.cpus[0].page_free[color].pgfl_queues[free_list][queue]));
+				LIST_FOREACH(pg, &uvm.page_free[color].pgfl_queues[free_list][queue], pageq.list) {
+					KASSERT(LIST_NEXT(pg, pageq.list) == LIST_NEXT(pg, listq.list));
+				}
+			}
+		}
+	}
+#endif
 
 	/*
 	 * pass up the values of virtual_space_start and
@@ -988,7 +1001,7 @@ uvm_page_recolor(int newncolors)
 					const u_int pgcolor = VM_PGCOLOR_BUCKET(pg);
 
 					LIST_REMOVE(pg, pageq.list); /* global */
-					LIST_REMOVE(pg, listq.list); /* cpu */
+					LIST_REMOVE(pg, listq.list); /* per-cpu */
 
 					old_gpgfl->pgfl_pages[queue]--;
 					VM_FREE_PAGE_TO_CPU(pg)->page_free[
@@ -1113,21 +1126,33 @@ uvm_pagealloc_pgfl(struct uvm_cpu *ucpu,
 	do {
 		pgfl = &ucpu->page_free[color];
 		gpgfl = &uvm.page_free[color];
+		struct pgflist * const freeq = pgfl->pgfl_queues[free_list];
+		struct pgflist * const gfreeq = gpgfl->pgfl_queues[free_list];
+
+#ifndef MULTIPROCESSOR
+		KASSERT(pgfl->pgfl_pages[try1] == gpgfl->pgfl_pages[try1]);
+		KASSERT(pgfl->pgfl_pages[try2] == gpgfl->pgfl_pages[try2]);
+#endif
 
 		/* cpu, try1 */
-		struct pgflist * const freeq = pgfl->pgfl_queues[free_list];
+#ifndef MULTIPROCESSOR
+		KASSERT(LIST_FIRST(&gfreeq[try1]) == LIST_FIRST(&freeq[try1]));
+		KASSERT(LIST_FIRST(&gfreeq[try2]) == LIST_FIRST(&freeq[try2]));
+#endif
+
 		if ((pg = LIST_FIRST(&freeq[try1])) != NULL) {
 			KASSERT(pg->pqflags & PQ_FREE);
 			KASSERT(ucpu == VM_FREE_PAGE_TO_CPU(pg));
 			KASSERT(pgfl == &ucpu->page_free[color]);
+			KASSERT(pgfl->pgfl_pages[try1] > 0);
 		    	ucpu->page_cpuhit++;
 			goto gotit;
 		}
 
 		/* global, try1 */
-		struct pgflist * const gfreeq = gpgfl->pgfl_queues[free_list];
 		if ((pg = LIST_FIRST(&gfreeq[try1])) != NULL) {
 			KASSERT(pg->pqflags & PQ_FREE);
+			KASSERT(gpgfl->pgfl_pages[try1] > 0);
 			ucpu = VM_FREE_PAGE_TO_CPU(pg);
 #ifndef MULTIPROCESSOR
 			KASSERT(ucpu == uvm.cpus);
@@ -1142,6 +1167,7 @@ uvm_pagealloc_pgfl(struct uvm_cpu *ucpu,
 			KASSERT(pg->pqflags & PQ_FREE);
 			KASSERT(ucpu == VM_FREE_PAGE_TO_CPU(pg));
 			KASSERT(pgfl == &ucpu->page_free[color]);
+			KASSERT(pgfl->pgfl_pages[try2] > 0);
 		    	ucpu->page_cpuhit++;
 			try1 = try2;
 			goto gotit;
@@ -1149,7 +1175,10 @@ uvm_pagealloc_pgfl(struct uvm_cpu *ucpu,
 
 		/* global, try2 */
 		if ((pg = LIST_FIRST(&gfreeq[try2])) != NULL) {
-			KASSERT(pg->pqflags & PQ_FREE);
+			KASSERTMSG(pg->pqflags & PQ_FREE,
+			    ("%s: pg %p in q %p not free!",
+			     __func__, pg, &gfreeq[try2]));
+			KASSERT(gpgfl->pgfl_pages[try2] > 0);
 			ucpu = VM_FREE_PAGE_TO_CPU(pg);
 #ifndef MULTIPROCESSOR
 			KASSERT(ucpu == uvm.cpus);
@@ -1167,10 +1196,36 @@ uvm_pagealloc_pgfl(struct uvm_cpu *ucpu,
 	return (NULL);
 
  gotit:
+#ifndef MULTIPROCESSOR
+	KASSERT(LIST_FIRST(&ucpu->page_free[color].pgfl_queues[free_list][try1]) == pg);
+	KASSERT(LIST_FIRST(&uvm.page_free[color].pgfl_queues[free_list][try1]) == pg);
+#if defined(DEBUG) && DEBUG > 1
+	{
+		struct vm_page *xpg = pg;
+		u_int i = 0;
+		do {
+			KASSERTMSG(LIST_NEXT(xpg, pageq.list) == LIST_NEXT(xpg, listq.list),
+			    ("%s: color %d free_list %d pg %p (%u): next %p/%p",
+			      __func__, color, free_list, xpg, i,
+			     LIST_NEXT(xpg, pageq.list),
+			     LIST_NEXT(xpg, listq.list)));
+		} while (++i < 500 && (xpg = LIST_NEXT(xpg, pageq.list)) != NULL);
+	}
+#else
+	KASSERTMSG(LIST_NEXT(pg, pageq.list) == LIST_NEXT(pg, listq.list),
+	    ("%s: color %d free_list %d pg %p: next %p/%p",
+	      __func__, color, free_list, pg,
+	     LIST_NEXT(pg, pageq.list),
+	     LIST_NEXT(pg, listq.list)));
+#endif
+#endif
 	LIST_REMOVE(pg, pageq.list);	/* global list */
 	LIST_REMOVE(pg, listq.list);	/* per-cpu list */
+#ifndef MULTIPROCESSOR
+	KASSERT(LIST_FIRST(&ucpu->page_free[color].pgfl_queues[free_list][try1]) == LIST_FIRST(&uvm.page_free[color].pgfl_queues[free_list][try1]));
+#endif
 	uvmexp.free--;
-	uvm_page_to_pggroup(pg)->pgrp_free--;
+	uvm.page_free[color].pgfl_pggroups[free_list]->pgrp_free--;
 	pgfl->pgfl_pages[try1]--;
 	gpgfl->pgfl_pages[try1]--;
 	ucpu->pages[try1]--;
@@ -1298,20 +1353,18 @@ uvm_pagealloc_strat(struct uvm_object *o
 			hint->pgrp_hints++;
 			pg = uvm_pagealloc_pgfl(ucpu, hint->pgrp_free_list,
 			    try1, try2, &color, anycolor);
-			if (pg != NULL)
+			if (pg != NULL) {
+				lcv = hint->pgrp_free_list;
 				goto gotit;
+			}
+			/*
+			 * Failed to get page so clear hint.
+			 */
+			uvm.page_free[color].pgfl_hint = NULL;
 			hint->pgrp_hintfails++;
 		}
 		/* Check all freelists in descending priority order. */
 		for (lcv = 0; lcv < VM_NFREELIST; lcv++) {
-#ifdef VM_FREELIST_NORMALOK_P
-			/*
-			 * Verify if this freelist can be used for normal
-			 * page allocations.
-			 */
-			if (!VM_FREELIST_NORMALOK_P(lcv))
-				continue;
-#endif
 			/*
 			 * If the hint didn't help, don't try it again.
 			 */
@@ -1332,7 +1385,8 @@ uvm_pagealloc_strat(struct uvm_object *o
 	case UVM_PGA_STRAT_FALLBACK:
 		/* Attempt to allocate from the specified free list. */
 		KASSERT(free_list >= 0 && free_list < VM_NFREELIST);
-		pg = uvm_pagealloc_pgfl(ucpu, free_list,
+		lcv = free_list;
+		pg = uvm_pagealloc_pgfl(ucpu, lcv,
 		    try1, try2, &color, anycolor);
 		if (pg != NULL)
 			goto gotit;
@@ -1353,6 +1407,17 @@ uvm_pagealloc_strat(struct uvm_object *o
 
  gotit:
 	/*
+	 * If there isn't a hint and we got a page, let's see if the page
+	 * group has enough pages to be used as a new hint.
+	 */
+	if (__predict_false(uvm.page_free[color].pgfl_hint == NULL)) {
+		struct uvm_pggroup * const hint =
+		    uvm.page_free[color].pgfl_pggroups[lcv];
+		if (hint->pgrp_free >= (hint->pgrp_freetarg << 2)) {
+			uvm.page_free[color].pgfl_hint = hint;
+		}
+	}
+	/*
 	 * We now know which color we actually allocated from; set
 	 * the next color accordingly.
 	 */
@@ -1383,7 +1448,8 @@ uvm_pagealloc_strat(struct uvm_object *o
 	pg->uanon = anon;
 	pg->flags = PG_BUSY|PG_CLEAN|PG_FAKE;
 	if (anon) {
-		struct uvm_pggroup * const grp = uvm_page_to_pggroup(pg);
+		struct uvm_pggroup * const grp =
+		    uvm.page_free[color].pgfl_pggroups[lcv];
 
 		anon->an_page = pg;
 		pg->pqflags = PQ_ANON;
@@ -1400,7 +1466,7 @@ uvm_pagealloc_strat(struct uvm_object *o
 #if defined(UVM_PAGE_TRKOWN)
 	pg->owner_tag = NULL;
 #endif
-	UVM_PAGE_OWN(pg, "new alloc");
+	UVM_PAGE_OWN(pg, "new alloc", __builtin_return_address(0));
 
 	if (flags & UVM_PGA_ZERO) {
 		/*
@@ -1538,6 +1604,7 @@ uvm_pagefree(struct vm_page *pg)
 
 	KASSERT((pg->flags & PG_PAGEOUT) == 0);
 	KASSERT(!(pg->pqflags & PQ_FREE));
+	KASSERT(mutex_owned(&uvm_pageqlock) || !uvmpdpol_pageisqueued_p(pg));
 	KASSERT(pg->uobject == NULL || mutex_owned(&pg->uobject->vmobjlock));
 	KASSERT(pg->uobject != NULL || pg->uanon == NULL ||
 		mutex_owned(&pg->uanon->an_lock));
@@ -1646,8 +1713,20 @@ uvm_pagefree(struct vm_page *pg)
 #endif /* DEBUG */
 
 
+	/* per-cpu list */
+	ucpu = curcpu()->ci_data.cpu_uvm;
+	struct pgfreelist * const pgfl = &ucpu->page_free[color];
+
 	/* global list */
-	struct pgfreelist *gpgfl = &uvm.page_free[color];
+	struct pgfreelist * const gpgfl = &uvm.page_free[color];
+
+#ifndef MULTIPROCESSOR
+	KASSERT(LIST_FIRST(&gpgfl->pgfl_queues[free_list][PGFL_UNKNOWN]) == LIST_FIRST(&pgfl->pgfl_queues[free_list][PGFL_UNKNOWN]));
+	KASSERT(LIST_FIRST(&gpgfl->pgfl_queues[free_list][PGFL_ZEROS]) == LIST_FIRST(&pgfl->pgfl_queues[free_list][PGFL_ZEROS]));
+	KASSERT(pgfl->pgfl_pages[PGFL_ZEROS] == gpgfl->pgfl_pages[PGFL_ZEROS]);
+	KASSERT(pgfl->pgfl_pages[PGFL_UNKNOWN] == gpgfl->pgfl_pages[PGFL_UNKNOWN]);
+#endif
+
 	LIST_INSERT_HEAD(&gpgfl->pgfl_queues[free_list][queue], pg, pageq.list);
 	gpgfl->pgfl_pages[queue]++;
 	struct uvm_pggroup * const grp = gpgfl->pgfl_pggroups[free_list];
@@ -1659,10 +1738,8 @@ uvm_pagefree(struct vm_page *pg)
 	 * is only updated here (though it might cleared in pagealloc).
 	 */
 	grp->pgrp_free++;
-	if (grp->pgrp_free >= grp->pgrp_freetarg
-#ifdef VM_FREELIST_NORMALOK_P
-	    && VM_FREELIST_NORMALOK_P(free_list)
-#endif
+	if (grp != hint
+	    && grp->pgrp_free >= grp->pgrp_freetarg * 4
 	    && (hint == NULL
 		|| (grp->pgrp_free - grp->pgrp_freetarg 
 		    > hint->pgrp_free - hint->pgrp_freetarg))) {
@@ -1675,9 +1752,7 @@ uvm_pagefree(struct vm_page *pg)
 	}
 
 	/* per-cpu list */
-	ucpu = curcpu()->ci_data.cpu_uvm;
 	pg->offset = (uintptr_t)ucpu;
-	struct pgfreelist *pgfl = &ucpu->page_free[color];
 	LIST_INSERT_HEAD(&pgfl->pgfl_queues[free_list][queue], pg, listq.list);
 	pgfl->pgfl_pages[queue]++;
 	ucpu->pages[queue]++;
@@ -1685,6 +1760,13 @@ uvm_pagefree(struct vm_page *pg)
 		ucpu->page_idle_zero = vm_page_zero_enable;
 	}
 
+#ifndef MULTIPROCESSOR
+	KASSERT(LIST_FIRST(&pgfl->pgfl_queues[free_list][queue]) == pg);
+	KASSERT(LIST_FIRST(&gpgfl->pgfl_queues[free_list][queue]) == pg);
+	KASSERT(pgfl->pgfl_pages[PGFL_ZEROS] == gpgfl->pgfl_pages[PGFL_ZEROS]);
+	KASSERT(pgfl->pgfl_pages[PGFL_UNKNOWN] == gpgfl->pgfl_pages[PGFL_UNKNOWN]);
+	KASSERT(LIST_NEXT(pg, pageq.list) == LIST_NEXT(pg, listq.list));
+#endif
 	mutex_spin_exit(&uvm_fpageqlock);
 }
 
@@ -1730,7 +1812,7 @@ uvm_page_unbusy(struct vm_page **pgs, in
 		} else {
 			UVMHIST_LOG(ubchist, "unbusying pg %p", pg,0,0,0);
 			pg->flags &= ~(PG_WANTED|PG_BUSY);
-			UVM_PAGE_OWN(pg, NULL);
+			UVM_PAGE_OWN(pg, NULL, NULL);
 		}
 	}
 }
@@ -1746,7 +1828,7 @@ uvm_page_unbusy(struct vm_page **pgs, in
  * => if "tag" is NULL then we are releasing page ownership
  */
 void
-uvm_page_own(struct vm_page *pg, const char *tag)
+uvm_page_own(struct vm_page *pg, const char *tag, const void *addr)
 {
 	struct uvm_object *uobj;
 	struct vm_anon *anon;
@@ -1767,23 +1849,22 @@ uvm_page_own(struct vm_page *pg, const c
 	if (tag) {
 		KASSERT((pg->flags & PG_BUSY) != 0);
 		if (pg->owner_tag) {
-			printf("uvm_page_own: page %p already owned "
-			    "by proc %d [%s]\n", pg,
-			    pg->owner, pg->owner_tag);
-			panic("uvm_page_own");
+			panic("uvm_page_own: page %p already owned "
+			    "by proc %d [%s, %p]", pg,
+			    pg->owner, pg->owner_tag, pg->owner_addr);
 		}
-		pg->owner = (curproc) ? curproc->p_pid :  (pid_t) -1;
-		pg->lowner = (curlwp) ? curlwp->l_lid :  (lwpid_t) -1;
+		pg->owner = curproc->p_pid;
+		pg->lowner = curlwp->l_lid;
 		pg->owner_tag = tag;
+		pg->owner_addr = addr ? addr : __builtin_return_address(0);
 		return;
 	}
 
 	/* drop ownership */
 	KASSERT((pg->flags & PG_BUSY) == 0);
 	if (pg->owner_tag == NULL) {
-		printf("uvm_page_own: dropping ownership of an non-owned "
-		    "page (%p)\n", pg);
-		panic("uvm_page_own");
+		panic("uvm_page_own: dropping ownership of an non-owned "
+		    "page (%p)", pg);
 	}
 	if (!uvmpdpol_pageisqueued_p(pg)) {
 		KASSERT((pg->uanon == NULL && pg->uobject == NULL) ||
@@ -1823,8 +1904,8 @@ uvm_pageidlezero(void)
 	do {
 		gpgfl = &uvm.page_free[nextcolor];
 		pgfl = &ucpu->page_free[nextcolor];
-		struct pgflist *gfreeq = &gpgfl->pgfl_queues[0][0];
-		struct pgflist *freeq = &pgfl->pgfl_queues[0][0];
+		struct pgflist *gfreeq = &gpgfl->pgfl_queues[0][PGFL_UNKNOWN];
+		struct pgflist *freeq = &pgfl->pgfl_queues[0][PGFL_UNKNOWN];
 		for (free_list = 0;
 		     free_list < VM_NFREELIST;
 		     free_list++,
@@ -1833,18 +1914,27 @@ uvm_pageidlezero(void)
 			if (sched_curcpu_runnable_p()) {
 				goto quit;
 			}
-			KASSERT(freeq == &pgfl->pgfl_queues[free_list][0]);
+			KASSERT(freeq == &pgfl->pgfl_queues[free_list][PGFL_UNKNOWN]);
 			while ((pg = LIST_FIRST(&freeq[PGFL_UNKNOWN])) != NULL) {
 				if (sched_curcpu_runnable_p()) {
 					goto quit;
 				}
+#ifndef MULTIPROCESSOR
+				KASSERT(LIST_FIRST(&gfreeq[PGFL_UNKNOWN]) == LIST_FIRST(&freeq[PGFL_UNKNOWN]));
+				KASSERT(LIST_FIRST(&gfreeq[PGFL_ZEROS]) == LIST_FIRST(&freeq[PGFL_ZEROS]));
+				KASSERT(LIST_FIRST(&gfreeq[PGFL_UNKNOWN]) == LIST_FIRST(&freeq[PGFL_UNKNOWN]));
+				KASSERT(LIST_NEXT(pg, pageq.list) == LIST_NEXT(pg, listq.list));
+#endif
 				LIST_REMOVE(pg, pageq.list); /* global list */
 				LIST_REMOVE(pg, listq.list); /* per-cpu list */
+#ifndef MULTIPROCESSOR
+				KASSERT(LIST_FIRST(&gfreeq[PGFL_UNKNOWN]) == LIST_FIRST(&freeq[PGFL_UNKNOWN]));
+#endif
 				ucpu->pages[PGFL_UNKNOWN]--;
 				gpgfl->pgfl_pages[PGFL_UNKNOWN]--;
 				pgfl->pgfl_pages[PGFL_UNKNOWN]--;
 				struct uvm_pggroup * const grp =
-				    uvm_page_to_pggroup(pg);
+				    gpgfl->pgfl_pggroups[free_list];
 				grp->pgrp_free--;
 				uvmexp.free--;
 				KASSERT(pg->pqflags == PQ_FREE);
@@ -1863,15 +1953,18 @@ uvm_pageidlezero(void)
 					mutex_spin_enter(&uvm_fpageqlock);
 					pg->pqflags = PQ_FREE;
 					LIST_INSERT_HEAD(&gfreeq[PGFL_UNKNOWN],
-					    pg, listq.list);
-					LIST_INSERT_HEAD(&freeq[PGFL_UNKNOWN],
 					    pg, pageq.list);
+					LIST_INSERT_HEAD(&freeq[PGFL_UNKNOWN],
+					    pg, listq.list);
 					ucpu->pages[PGFL_UNKNOWN]++;
 					gpgfl->pgfl_pages[PGFL_UNKNOWN]++;
 					pgfl->pgfl_pages[PGFL_UNKNOWN]++;
 					grp->pgrp_free++;
 					uvmexp.free++;
 					uvmexp.zeroaborts++;
+#ifndef MULTIPROCESSOR
+					KASSERT(LIST_FIRST(&gfreeq[PGFL_UNKNOWN]) == LIST_FIRST(&freeq[PGFL_UNKNOWN]));
+#endif
 					goto quit;
 				}
 #else

Index: src/sys/uvm/uvm_page.h
diff -u src/sys/uvm/uvm_page.h:1.55.14.8 src/sys/uvm/uvm_page.h:1.55.14.9
--- src/sys/uvm/uvm_page.h:1.55.14.8	Thu Feb 16 04:20:45 2012
+++ src/sys/uvm/uvm_page.h	Wed Feb 29 18:03:39 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_page.h,v 1.55.14.8 2012/02/16 04:20:45 matt Exp $	*/
+/*	$NetBSD: uvm_page.h,v 1.55.14.9 2012/02/29 18:03:39 matt Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -153,6 +153,7 @@ struct vm_page {
 	pid_t			owner;		/* proc that set PG_BUSY */
 	lwpid_t			lowner;		/* lwp that set PG_BUSY */
 	const char		*owner_tag;	/* why it was set busy */
+	const void		*owner_addr;	/* who allocated it */
 #endif
 };
 
@@ -328,7 +329,7 @@ extern int vm_nphysseg;
 
 void uvm_page_init(vaddr_t *, vaddr_t *);
 #if defined(UVM_PAGE_TRKOWN)
-void uvm_page_own(struct vm_page *, const char *);
+void uvm_page_own(struct vm_page *, const char *, const void *);
 #endif
 #if !defined(PMAP_STEAL_MEMORY)
 bool uvm_page_physget(paddr_t *);

Index: src/sys/uvm/uvm_pdaemon.c
diff -u src/sys/uvm/uvm_pdaemon.c:1.93.4.2.4.7 src/sys/uvm/uvm_pdaemon.c:1.93.4.2.4.8
--- src/sys/uvm/uvm_pdaemon.c:1.93.4.2.4.7	Fri Feb 17 23:36:04 2012
+++ src/sys/uvm/uvm_pdaemon.c	Wed Feb 29 18:03:40 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_pdaemon.c,v 1.93.4.2.4.7 2012/02/17 23:36:04 matt Exp $	*/
+/*	$NetBSD: uvm_pdaemon.c,v 1.93.4.2.4.8 2012/02/29 18:03:40 matt Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -71,7 +71,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_pdaemon.c,v 1.93.4.2.4.7 2012/02/17 23:36:04 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_pdaemon.c,v 1.93.4.2.4.8 2012/02/29 18:03:40 matt Exp $");
 
 #include "opt_uvmhist.h"
 #include "opt_readahead.h"
@@ -308,6 +308,10 @@ uvmpd_tune(void)
 		val = (grp->pgrp_freemin * 4) / 3;
 		if (val <= grp->pgrp_freemin)
 			val = grp->pgrp_freemin + 1;
+#ifdef VM_FREELIST_NORMALOK_P
+		if (!VM_FREELIST_NORMALOK_P(grp->pgrp_free_list))
+			val *= 4;
+#endif
 		grp->pgrp_freetarg = val + extrapages / uvmexp.npggroups;
 		if (grp->pgrp_freetarg > grp->pgrp_npages / 2)
 			grp->pgrp_freetarg = grp->pgrp_npages / 2;
@@ -874,7 +878,7 @@ uvmpd_scan_queue(struct uvm_pggroup *grp
 	uvmpdpol_scaninit(grp);
 
 	UVMHIST_LOG(pdhist,"  [%zd]: want free target (%u)",
-	    grp - uvm.pggrous, grp->pgrp_freetarg << 2, 0, 0);
+	    grp - uvm.pggroups, grp->pgrp_freetarg << 2, 0, 0);
 	while (/* CONSTCOND */ 1) {
 
 		/*
@@ -1074,7 +1078,7 @@ uvmpd_scan_queue(struct uvm_pggroup *grp
 		 */
 
 		pg->flags |= PG_BUSY;
-		UVM_PAGE_OWN(pg, "scan_queue");
+		UVM_PAGE_OWN(pg, "scan_queue", NULL);
 
 		pg->flags |= PG_PAGEOUT;
 		uvm_pagedequeue(pg);
@@ -1088,7 +1092,7 @@ uvmpd_scan_queue(struct uvm_pggroup *grp
 
 		if (swapcluster_add(&swc, pg)) {
 			pg->flags &= ~(PG_BUSY|PG_PAGEOUT);
-			UVM_PAGE_OWN(pg, NULL);
+			UVM_PAGE_OWN(pg, NULL, NULL);
 			mutex_enter(&uvm_pageqlock);
 			dirtyreacts++;
 			uvm_pageactivate(pg);

Index: src/sys/uvm/uvm_pglist.c
diff -u src/sys/uvm/uvm_pglist.c:1.42.16.12 src/sys/uvm/uvm_pglist.c:1.42.16.13
--- src/sys/uvm/uvm_pglist.c:1.42.16.12	Tue Feb 14 01:12:42 2012
+++ src/sys/uvm/uvm_pglist.c	Wed Feb 29 18:03:40 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_pglist.c,v 1.42.16.12 2012/02/14 01:12:42 matt Exp $	*/
+/*	$NetBSD: uvm_pglist.c,v 1.42.16.13 2012/02/29 18:03:40 matt Exp $	*/
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_pglist.c,v 1.42.16.12 2012/02/14 01:12:42 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_pglist.c,v 1.42.16.13 2012/02/29 18:03:40 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -109,12 +109,16 @@ uvm_pglist_add(struct vm_page *pg, struc
 	if (tp == NULL)
 		panic("uvm_pglistalloc: page not on freelist");
 #endif
+#ifndef MULTIPROCESSOR
+	KASSERT(LIST_NEXT(pg, pageq.list) == LIST_NEXT(pg, listq.list));
+	KASSERT(LIST_FIRST(&uvm.page_free[color].pgfl_queues[free_list][queue]) == LIST_FIRST(&ucpu->page_free[color].pgfl_queues[free_list][queue]));
+#endif
 	LIST_REMOVE(pg, pageq.list);	/* global */
 	LIST_REMOVE(pg, listq.list);	/* cpu */
 	uvm.page_free[color].pgfl_pages[queue]--;
 	ucpu->page_free[color].pgfl_pages[queue]--;
 	ucpu->pages[queue]--;
-	uvm_page_to_pggroup(pg)->pgrp_free--;
+	uvm.page_free[color].pgfl_pggroups[free_list]->pgrp_free--;
 	uvmexp.free--;
 	if (pg->flags & PG_ZERO)
 		uvmexp.zeropages--;
@@ -624,16 +628,22 @@ uvm_pglistfree(struct pglist *list)
 		const size_t queue = iszero ? PGFL_ZEROS : PGFL_UNKNOWN;
 #ifndef MULTIPROCESSOR
 		KASSERT(ucpu == uvm.cpus);
+		KASSERT(LIST_FIRST(&uvm.page_free[color].pgfl_queues[free_list][queue]) == LIST_FIRST(&ucpu->page_free[color].pgfl_queues[free_list][queue]));
 #endif
 		pg->offset = (uintptr_t)ucpu;
 		LIST_INSERT_HEAD(&uvm.page_free[color].
 		    pgfl_queues[free_list][queue], pg, pageq.list);
 		LIST_INSERT_HEAD(&ucpu->page_free[color].
 		    pgfl_queues[free_list][queue], pg, listq.list);
+#ifndef MULTIPROCESSOR
+		KASSERT(LIST_FIRST(&uvm.page_free[color].pgfl_queues[free_list][queue]) == pg);
+		KASSERT(LIST_FIRST(&ucpu->page_free[color].pgfl_queues[free_list][queue]) == pg);
+		KASSERT(LIST_NEXT(pg, pageq.list) == LIST_NEXT(pg, listq.list));
+#endif
 		uvm.page_free[color].pgfl_pages[queue]++;
 		ucpu->page_free[color].pgfl_pages[queue]++;
 		ucpu->pages[queue]++;
-		uvm_page_to_pggroup(pg)->pgrp_free++;
+		uvm.page_free[color].pgfl_pggroups[free_list]->pgrp_free++;
 		uvmexp.free++;
 		if (iszero)
 			uvmexp.zeropages++;

Index: src/sys/uvm/uvm_vnode.c
diff -u src/sys/uvm/uvm_vnode.c:1.90.28.3 src/sys/uvm/uvm_vnode.c:1.90.28.4
--- src/sys/uvm/uvm_vnode.c:1.90.28.3	Fri Jun  3 07:52:48 2011
+++ src/sys/uvm/uvm_vnode.c	Wed Feb 29 18:03:40 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_vnode.c,v 1.90.28.3 2011/06/03 07:52:48 matt Exp $	*/
+/*	$NetBSD: uvm_vnode.c,v 1.90.28.4 2012/02/29 18:03:40 matt Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -50,7 +50,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_vnode.c,v 1.90.28.3 2011/06/03 07:52:48 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_vnode.c,v 1.90.28.4 2012/02/29 18:03:40 matt Exp $");
 
 #include "fs_nfs.h"
 #include "opt_uvmhist.h"
@@ -311,7 +311,7 @@ uvn_findpage(struct uvm_object *uobj, vo
 
 		/* mark the page BUSY and we're done. */
 		pg->flags |= PG_BUSY;
-		UVM_PAGE_OWN(pg, "uvn_findpage");
+		UVM_PAGE_OWN(pg, "uvn_findpage", NULL);
 		UVMHIST_LOG(ubchist, "found %p (color %u)",
 		    pg, VM_PGCOLOR_BUCKET(pg), 0,0);
 		break;

Reply via email to