Module Name:    src
Committed By:   matt
Date:           Tue Jan 26 21:26:28 UTC 2010

Modified Files:
        src/sys/uvm [matt-nb5-mips64]: uvm_extern.h uvm_fault.c uvm_km.c
            uvm_page.c

Log Message:
Pass hints to uvm_pagealloc* to get it to use the right page color rather
than guess the right page color.


To generate a diff of this commit:
cvs rdiff -u -r1.148.4.2 -r1.148.4.2.4.1 src/sys/uvm/uvm_extern.h
cvs rdiff -u -r1.125.6.1 -r1.125.6.1.4.1 src/sys/uvm/uvm_fault.c
cvs rdiff -u -r1.101.4.2.4.1 -r1.101.4.2.4.2 src/sys/uvm/uvm_km.c
cvs rdiff -u -r1.140.6.3.4.1 -r1.140.6.3.4.2 src/sys/uvm/uvm_page.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/uvm/uvm_extern.h
diff -u src/sys/uvm/uvm_extern.h:1.148.4.2 src/sys/uvm/uvm_extern.h:1.148.4.2.4.1
--- src/sys/uvm/uvm_extern.h:1.148.4.2	Wed Apr  1 00:25:23 2009
+++ src/sys/uvm/uvm_extern.h	Tue Jan 26 21:26:28 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_extern.h,v 1.148.4.2 2009/04/01 00:25:23 snj Exp $	*/
+/*	$NetBSD: uvm_extern.h,v 1.148.4.2.4.1 2010/01/26 21:26:28 matt Exp $	*/
 
 /*
  *
@@ -146,6 +146,7 @@
 #define UVM_FLAG_QUANTUM 0x800000 /* entry can never be split later */
 #define UVM_FLAG_WAITVA  0x1000000 /* wait for va */
 #define UVM_FLAG_VAONLY  0x2000000 /* unmap: no pages are mapped */
+#define UVM_FLAG_COLORMATCH 0x4000000 /* match color given in off */
 
 /* macros to extract info */
 #define UVM_PROTECTION(X)	((X) & UVM_PROT_MASK)

Index: src/sys/uvm/uvm_fault.c
diff -u src/sys/uvm/uvm_fault.c:1.125.6.1 src/sys/uvm/uvm_fault.c:1.125.6.1.4.1
--- src/sys/uvm/uvm_fault.c:1.125.6.1	Mon Feb  2 18:31:37 2009
+++ src/sys/uvm/uvm_fault.c	Tue Jan 26 21:26:28 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_fault.c,v 1.125.6.1 2009/02/02 18:31:37 snj Exp $	*/
+/*	$NetBSD: uvm_fault.c,v 1.125.6.1.4.1 2010/01/26 21:26:28 matt Exp $	*/
 
 /*
  *
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.125.6.1 2009/02/02 18:31:37 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.125.6.1.4.1 2010/01/26 21:26:28 matt Exp $");
 
 #include "opt_uvmhist.h"
 
@@ -362,7 +362,8 @@
 			 * no page, we must try and bring it in.
 			 */
 
-			pg = uvm_pagealloc(NULL, 0, anon, 0);
+			pg = uvm_pagealloc(NULL, ufi->orig_rvaddr,
+			    NULL, UVM_FLAG_COLORMATCH);
 			if (pg == NULL) {		/* out of RAM.  */
 				uvmfault_unlockall(ufi, amap, NULL, anon);
 				uvmexp.fltnoram++;
@@ -620,8 +621,8 @@
 		 * so have uvm_pagealloc() do that for us.
 		 */
 
-		pg = uvm_pagealloc(NULL, 0, anon,
-		    (opg == NULL) ? UVM_PGA_ZERO : 0);
+		pg = uvm_pagealloc(NULL, ufi->orig_rvaddr, anon,
+		    UVM_FLAG_COLORMATCH | (opg == NULL ? UVM_PGA_ZERO : 0));
 	} else {
 		pg = NULL;
 	}
@@ -1266,7 +1267,8 @@
 			if (anon->an_ref == 1) {
 
 				/* get new un-owned replacement page */
-				pg = uvm_pagealloc(NULL, 0, NULL, 0);
+				pg = uvm_pagealloc(NULL, ufi.orig_rvaddr,
+				    NULL, UVM_FLAG_COLORMATCH);
 				if (pg == NULL) {
 					uvmfault_unlockall(&ufi, amap, uobj,
 					    anon);

Index: src/sys/uvm/uvm_km.c
diff -u src/sys/uvm/uvm_km.c:1.101.4.2.4.1 src/sys/uvm/uvm_km.c:1.101.4.2.4.2
--- src/sys/uvm/uvm_km.c:1.101.4.2.4.1	Sat Jan  9 05:54:40 2010
+++ src/sys/uvm/uvm_km.c	Tue Jan 26 21:26:28 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_km.c,v 1.101.4.2.4.1 2010/01/09 05:54:40 matt Exp $	*/
+/*	$NetBSD: uvm_km.c,v 1.101.4.2.4.2 2010/01/26 21:26:28 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.1 2010/01/09 05:54:40 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_km.c,v 1.101.4.2.4.2 2010/01/26 21:26:28 matt Exp $");
 
 #include "opt_uvmhist.h"
 
@@ -589,7 +589,7 @@
 	loopva = kva;
 	loopsize = size;
 
-	pgaflags = 0;
+	pgaflags = UVM_FLAG_COLORMATCH;
 	if (flags & UVM_KMF_NOWAIT)
 		pgaflags |= UVM_PGA_USERESERVE;
 	if (flags & UVM_KMF_ZERO)

Index: src/sys/uvm/uvm_page.c
diff -u src/sys/uvm/uvm_page.c:1.140.6.3.4.1 src/sys/uvm/uvm_page.c:1.140.6.3.4.2
--- src/sys/uvm/uvm_page.c:1.140.6.3.4.1	Sat Sep 12 18:38:46 2009
+++ src/sys/uvm/uvm_page.c	Tue Jan 26 21:26:28 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_page.c,v 1.140.6.3.4.1 2009/09/12 18:38:46 matt Exp $	*/
+/*	$NetBSD: uvm_page.c,v 1.140.6.3.4.2 2010/01/26 21:26:28 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.1 2009/09/12 18:38:46 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.140.6.3.4.2 2010/01/26 21:26:28 matt Exp $");
 
 #include "opt_uvmhist.h"
 #include "opt_readahead.h"
@@ -1074,7 +1074,7 @@
 	lwp_t *l;
 
 	KASSERT(obj == NULL || anon == NULL);
-	KASSERT(anon == NULL || off == 0);
+	KASSERT(anon == NULL || (flags & UVM_FLAG_COLORMATCH) || off == 0);
 	KASSERT(off == trunc_page(off));
 	KASSERT(obj == NULL || mutex_owned(&obj->vmobjlock));
 	KASSERT(anon == NULL || mutex_owned(&anon->an_lock));
@@ -1089,7 +1089,11 @@
 	 */
 
 	ucpu = curcpu()->ci_data.cpu_uvm;
-	color = ucpu->page_free_nextcolor;
+	if (flags & UVM_FLAG_COLORMATCH) {
+		color = atop(off) & uvmexp.colormask;
+	} else {
+		color = ucpu->page_free_nextcolor;
+	}
 
 	/*
 	 * check to see if we need to generate some free pages waking

Reply via email to