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