Module Name: src Committed By: uebayasi Date: Sun Feb 28 06:52:13 UTC 2010
Modified Files: src/sys/uvm [uebayasi-xip]: uvm_fault.c Log Message: Put comments why device pages skip some code paths. Don't skip accounting for "neighbor" device pages. To generate a diff of this commit: cvs rdiff -u -r1.166.2.4 -r1.166.2.5 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.166.2.4 src/sys/uvm/uvm_fault.c:1.166.2.5 --- src/sys/uvm/uvm_fault.c:1.166.2.4 Wed Feb 24 16:22:58 2010 +++ src/sys/uvm/uvm_fault.c Sun Feb 28 06:52:12 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_fault.c,v 1.166.2.4 2010/02/24 16:22:58 uebayasi Exp $ */ +/* $NetBSD: uvm_fault.c,v 1.166.2.5 2010/02/28 06:52:12 uebayasi Exp $ */ /* * @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.166.2.4 2010/02/24 16:22:58 uebayasi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.166.2.5 2010/02/28 06:52:12 uebayasi Exp $"); #include "opt_uvmhist.h" #include "opt_device_page.h" @@ -1769,10 +1769,6 @@ mutex_enter(&uvm_pageqlock); uvm_pageenqueue(pg); mutex_exit(&uvm_pageqlock); - UVMHIST_LOG(maphist, - " MAPPING: n obj: pm=0x%x, va=0x%x, pg=0x%x", - ufi->orig_map->pmap, currva, pg, 0); - uvmexp.fltnomap++; /* * Since this page isn't the page that's actually faulting, @@ -1790,6 +1786,11 @@ UVM_PAGE_OWN(pg, NULL); uvm_fault_lower_neighbor_enter: + UVMHIST_LOG(maphist, + " MAPPING: n obj: pm=0x%x, va=0x%x, pg=0x%x", + ufi->orig_map->pmap, currva, pg, 0); + uvmexp.fltnomap++; + (void) pmap_enter(ufi->orig_map->pmap, currva, VM_PAGE_TO_PHYS(pg), readonly ? (flt->enter_prot & ~VM_PROT_WRITE) : @@ -1962,8 +1963,10 @@ pg = uobjpage; /* map in the actual object */ uvmexp.flt_obj++; - if (uvm_pageisdevice_p(uobjpage)) + if (uvm_pageisdevice_p(uobjpage)) { + /* XIP'ed device pages are always read-only */ goto uvm_fault_lower_direct_done; + } if (UVM_ET_ISCOPYONWRITE(ufi->entry) || UVM_OBJ_NEEDS_WRITEFAULT(uobjpage->uobject)) @@ -2094,8 +2097,13 @@ */ } - if (uvm_pageisdevice_p(uobjpage)) + if (uvm_pageisdevice_p(uobjpage)) { + /* + * XIP devices pages are never paged out, no need to + * dispose. + */ goto uvm_fault_lower_promote_done; + } /* * dispose of uobjpage. it can't be PG_RELEASED @@ -2176,8 +2184,10 @@ (flt->enter_prot & ~VM_PROT_WRITE) : flt->enter_prot, flt->access_type | PMAP_CANFAIL | (flt->wire_mapping ? PMAP_WIRED : 0)) != 0) { - if (uvm_pageisdevice_p(pg)) + if (uvm_pageisdevice_p(pg)) { + /* Device pages never involve paging activity. */ goto uvm_fault_lower_enter_error_done; + } /* * No need to undo what we did; we can simply think of