diff options
| author | uebayasi <uebayasi@NetBSD.org> | 2010-02-24 06:18:19 +0000 |
|---|---|---|
| committer | uebayasi <uebayasi@NetBSD.org> | 2010-02-24 06:18:19 +0000 |
| commit | f736e76fa508684b573020bc67cc6a0c3a64c6c9 (patch) | |
| tree | 4b042525eecb00dc7d331532fc752d46996e49b7 /sys | |
| parent | d098c87db8f6f1337d7f7055e131421010445ce1 (diff) | |
uvm_fault_upper_lookup, uvm_fault_upper_neighbor: There is no point to call
pmap_update() without calling pmap_enter().
(Probably calling only once after loop (as done in uvm_fault_lower_lookup())
is enough. If done so, other threads see entered neighbor pages as reflected
a little latter.)
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/uvm/uvm_fault.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/sys/uvm/uvm_fault.c b/sys/uvm/uvm_fault.c index 660b2810e18..640dee96c03 100644 --- a/sys/uvm/uvm_fault.c +++ b/sys/uvm/uvm_fault.c @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_fault.c,v 1.171 2010/02/24 05:26:28 uebayasi Exp $ */ +/* $NetBSD: uvm_fault.c,v 1.172 2010/02/24 06:18:19 uebayasi Exp $ */ /* * @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.171 2010/02/24 05:26:28 uebayasi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.172 2010/02/24 06:18:19 uebayasi Exp $"); #include "opt_uvmhist.h" @@ -1111,8 +1111,13 @@ uvm_fault_upper_lookup( struct vm_anon *anon = anons[lcv]; mutex_enter(&anon->an_lock); - uvm_fault_upper_neighbor(ufi, flt, currva, - anon->an_page, anon->an_ref > 1); + struct vm_page *pg = anon->an_page; + + /* ignore loaned and busy pages */ + if (pg != NULL && pg->loan_count == 0 && + (pg->flags & PG_BUSY) == 0) + uvm_fault_upper_neighbor(ufi, flt, currva, + pg, anon->an_ref > 1); mutex_exit(&anon->an_lock); } } @@ -1141,11 +1146,6 @@ uvm_fault_upper_neighbor( { UVMHIST_FUNC("uvm_fault_upper_neighbor"); UVMHIST_CALLED(maphist); - /* ignore loaned and busy pages */ - if (pg == NULL || pg->loan_count != 0 || - (pg->flags & PG_BUSY) != 0) - goto uvm_fault_upper_lookup_enter_done; - mutex_enter(&uvm_pageqlock); uvm_pageenqueue(pg); mutex_exit(&uvm_pageqlock); @@ -1166,7 +1166,6 @@ uvm_fault_upper_neighbor( flt->enter_prot, PMAP_CANFAIL | (flt->wire_mapping ? PMAP_WIRED : 0)); -uvm_fault_upper_lookup_enter_done: pmap_update(ufi->orig_map->pmap); } |
