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