Module Name: src
Committed By: uebayasi
Date: Wed Feb 24 04:20:45 UTC 2010
Modified Files:
src/sys/uvm: uvm_fault.c
Log Message:
Record if "promote" is done in UVMHIST. Do it for "upper" fault too.
To generate a diff of this commit:
cvs rdiff -u -r1.167 -r1.168 src/sys/uvm/uvm_fault.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_fault.c
diff -u src/sys/uvm/uvm_fault.c:1.167 src/sys/uvm/uvm_fault.c:1.168
--- src/sys/uvm/uvm_fault.c:1.167 Wed Feb 24 04:18:09 2010
+++ src/sys/uvm/uvm_fault.c Wed Feb 24 04:20:45 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_fault.c,v 1.167 2010/02/24 04:18:09 uebayasi Exp $ */
+/* $NetBSD: uvm_fault.c,v 1.168 2010/02/24 04:20:45 uebayasi Exp $ */
/*
*
@@ -39,7 +39,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.167 2010/02/24 04:18:09 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.168 2010/02/24 04:20:45 uebayasi Exp $");
#include "opt_uvmhist.h"
@@ -704,6 +704,7 @@
bool wire_paging;
bool maxprot;
bool cow_now;
+ bool promote;
};
static inline int uvm_fault_check(
@@ -912,6 +913,8 @@
flt->cow_now = (flt->access_type & VM_PROT_WRITE) != 0;
}
+ flt->promote = false;
+
/*
* handle "needs_copy" case. if we need to copy the amap we will
* have to drop our readlock and relock it with a write lock. (we
@@ -1437,6 +1440,7 @@
*/
if (flt->cow_now && anon->an_ref > 1) {
+ flt->promote = true;
error = uvm_fault_upper_promote(ufi, flt, uobj, anon);
} else {
error = uvm_fault_upper_direct(ufi, flt, uobj, anon);
@@ -1568,8 +1572,8 @@
* now map the page in.
*/
- UVMHIST_LOG(maphist, " MAPPING: anon: pm=0x%x, va=0x%x, pg=0x%x",
- ufi->orig_map->pmap, ufi->orig_rvaddr, pg, 0);
+ UVMHIST_LOG(maphist, " MAPPING: anon: pm=0x%x, va=0x%x, pg=0x%x, promote=%d",
+ ufi->orig_map->pmap, ufi->orig_rvaddr, pg, flt->promote);
if (pmap_enter(ufi->orig_map->pmap, ufi->orig_rvaddr, VM_PAGE_TO_PHYS(pg),
flt->enter_prot, flt->access_type | PMAP_CANFAIL | (flt->wire_mapping ? PMAP_WIRED : 0))
!= 0) {
@@ -1648,7 +1652,6 @@
#ifdef DIAGNOSTIC
struct vm_amap * const amap = ufi->entry->aref.ar_amap;
#endif
- bool promote;
int error;
UVMHIST_FUNC("uvm_fault_lower1"); UVMHIST_CALLED(maphist);
@@ -1673,13 +1676,13 @@
if (uobj == NULL) {
uobjpage = PGO_DONTCARE;
- promote = true; /* always need anon here */
+ flt->promote = true; /* always need anon here */
} else {
KASSERT(uobjpage != PGO_DONTCARE);
- promote = flt->cow_now && UVM_ET_ISCOPYONWRITE(ufi->entry);
+ flt->promote = flt->cow_now && UVM_ET_ISCOPYONWRITE(ufi->entry);
}
UVMHIST_LOG(maphist, " case 2 fault: promote=%d, zfill=%d",
- promote, (uobj == NULL), 0,0);
+ flt->promote, (uobj == NULL), 0,0);
/*
* if uobjpage is not null then we do not need to do I/O to get the
@@ -1719,7 +1722,7 @@
KASSERT(uobj == NULL || !UVM_OBJ_IS_CLEAN(uobjpage->uobject) ||
(uobjpage->flags & PG_CLEAN) != 0);
- if (promote == false) {
+ if (flt->promote == false) {
error = uvm_fault_lower_direct(ufi, flt, uobj, uobjpage);
} else {
error = uvm_fault_lower_promote(ufi, flt, uobj, uobjpage);
@@ -2050,8 +2053,8 @@
*/
UVMHIST_LOG(maphist,
- " MAPPING: case2: pm=0x%x, va=0x%x, pg=0x%x, promote=XXX",
- ufi->orig_map->pmap, ufi->orig_rvaddr, pg, 0);
+ " MAPPING: case2: pm=0x%x, va=0x%x, pg=0x%x, promote=%d",
+ ufi->orig_map->pmap, ufi->orig_rvaddr, pg, flt->promote);
KASSERT((flt->access_type & VM_PROT_WRITE) == 0 ||
(pg->flags & PG_RDONLY) == 0);
if (pmap_enter(ufi->orig_map->pmap, ufi->orig_rvaddr, VM_PAGE_TO_PHYS(pg),