Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/uvm Reduce diff between upper/lower neighbor handlers.



details:   https://anonhg.NetBSD.org/src/rev/d77d499dda06
branches:  trunk
changeset: 751438:d77d499dda06
user:      uebayasi <uebayasi%NetBSD.org@localhost>
date:      Thu Feb 04 05:48:26 2010 +0000

description:
Reduce diff between upper/lower neighbor handlers.

diffstat:

 sys/uvm/uvm_fault.c |  87 ++++++++++++++++++++++++++--------------------------
 1 files changed, 44 insertions(+), 43 deletions(-)

diffs (205 lines):

diff -r a81db4a272d7 -r d77d499dda06 sys/uvm/uvm_fault.c
--- a/sys/uvm/uvm_fault.c       Thu Feb 04 03:32:21 2010 +0000
+++ b/sys/uvm/uvm_fault.c       Thu Feb 04 05:48:26 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: uvm_fault.c,v 1.160 2010/02/04 03:32:21 uebayasi Exp $ */
+/*     $NetBSD: uvm_fault.c,v 1.161 2010/02/04 05:48:26 uebayasi Exp $ */
 
 /*
  *
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.160 2010/02/04 03:32:21 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.161 2010/02/04 05:48:26 uebayasi Exp $");
 
 #include "opt_uvmhist.h"
 
@@ -718,7 +718,7 @@
     struct vm_anon **, struct vm_page **);
 static inline void uvm_fault_upper_lookup_neighbor(
     struct uvm_faultinfo *, struct uvm_faultctx *,
-    vaddr_t, struct vm_anon *);
+    vaddr_t, struct vm_page *, bool);
 static inline int uvm_fault_upper_loan(
     struct uvm_faultinfo *, struct uvm_faultctx *,
     struct vm_anon *, struct uvm_object **);
@@ -748,7 +748,7 @@
     struct vm_page **);
 static inline void uvm_fault_lower_generic_lookup_neighbor(
     struct uvm_faultinfo *, struct uvm_faultctx *,
-    vaddr_t, struct vm_page *);
+    vaddr_t, struct vm_page *, bool);
 static inline int uvm_fault_lower_generic(
     struct uvm_faultinfo *, struct uvm_faultctx *,
     struct vm_page **);
@@ -761,6 +761,9 @@
 static inline int uvm_fault_lower_generic_direct(
     struct uvm_faultinfo *, struct uvm_faultctx *,
     struct uvm_object *, struct vm_page *);
+static inline int uvm_fault_lower_generic_direct_loan(
+    struct uvm_faultinfo *, struct uvm_faultctx *,
+    struct uvm_object *, struct vm_page **, struct vm_page **);
 static inline int uvm_fault_lower_generic_promote(
     struct uvm_faultinfo *, struct uvm_faultctx *,
     struct uvm_object *, struct vm_page *);
@@ -1093,7 +1096,12 @@
                if (lcv == flt->centeridx) {            /* save center for later! */
                        shadowed = true;
                } else {
-                       uvm_fault_upper_lookup_neighbor(ufi, flt, currva, anons[lcv]);
+                       struct vm_anon *anon = anons[lcv];
+
+                       mutex_enter(&anon->an_lock);
+                       uvm_fault_upper_lookup_neighbor(ufi, flt, currva,
+                           anon->an_page, anon->an_ref > 1);
+                       mutex_exit(&anon->an_lock);
                }
        }
 
@@ -1117,39 +1125,36 @@
 static void
 uvm_fault_upper_lookup_neighbor(
        struct uvm_faultinfo *ufi, struct uvm_faultctx *flt,
-       vaddr_t currva, struct vm_anon *anon)
+       vaddr_t currva, struct vm_page *pg, bool readonly)
 {
 
-       mutex_enter(&anon->an_lock);
-
        /* ignore loaned and busy pages */
-       if (anon->an_page == NULL || anon->an_page->loan_count != 0 ||
-           (anon->an_page->flags & PG_BUSY) != 0)
+       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(anon->an_page);
+       uvm_pageenqueue(pg);
        mutex_exit(&uvm_pageqlock);
        UVMHIST_LOG(maphist,
            "  MAPPING: n anon: pm=0x%x, va=0x%x, pg=0x%x",
-           ufi->orig_map->pmap, currva, anon->an_page, 0);
+           ufi->orig_map->pmap, currva, pg, 0);
        uvmexp.fltnamap++;
 
        /*
-        * Since this isn't the page that's actually faulting,
-        * ignore pmap_enter() failures; it's not critical
-        * that we enter these right now.
+        * Since this page isn't the page that's actually faulting,
+        * ignore pmap_enter() failures; it's not critical that we
+        * enter these right now.
         */
 
        (void) pmap_enter(ufi->orig_map->pmap, currva,
-           VM_PAGE_TO_PHYS(anon->an_page),
-           (anon->an_ref > 1) ? (flt->enter_prot & ~VM_PROT_WRITE) :
+           VM_PAGE_TO_PHYS(pg),
+           readonly ? (flt->enter_prot & ~VM_PROT_WRITE) :
            flt->enter_prot,
            PMAP_CANFAIL | (flt->wire_mapping ? PMAP_WIRED : 0));
 
 uvm_fault_upper_lookup_enter_done:
        pmap_update(ufi->orig_map->pmap);
-       mutex_exit(&anon->an_lock);
 }
 
 static int
@@ -1303,9 +1308,14 @@
                        UVMHIST_LOG(maphist, "  got uobjpage "
                            "(0x%x) with locked get",
                            curpg, 0,0,0);
-               } else
+               } else {
+                       bool readonly = (curpg->flags & PG_RDONLY)
+                           || (curpg->loan_count > 0)
+                           || UVM_OBJ_NEEDS_WRITEFAULT(curpg->uobject);
+
                        uvm_fault_lower_generic_lookup_neighbor(ufi, flt,
-                           currva, curpg);
+                           currva, curpg, readonly);
+               }
        }
        pmap_update(ufi->orig_map->pmap);
        return 0;
@@ -1314,9 +1324,8 @@
 static void
 uvm_fault_lower_generic_lookup_neighbor(
        struct uvm_faultinfo *ufi, struct uvm_faultctx *flt,
-       vaddr_t currva, struct vm_page *curpg)
+       vaddr_t currva, struct vm_page *pg, bool readonly)
 {
-       bool readonly;
 
        /*
         * calling pgo_get with PGO_LOCKED returns us pages which
@@ -1325,11 +1334,11 @@
         */
 
        mutex_enter(&uvm_pageqlock);
-       uvm_pageenqueue(curpg);
+       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, curpg, 0);
+           "  MAPPING: n obj: pm=0x%x, va=0x%x, pg=0x%x",
+           ufi->orig_map->pmap, currva, pg, 0);
        uvmexp.fltnomap++;
 
        /*
@@ -1337,17 +1346,14 @@
         * ignore pmap_enter() failures; it's not critical that we
         * enter these right now.
         */
-       KASSERT((curpg->flags & PG_PAGEOUT) == 0);
-       KASSERT((curpg->flags & PG_RELEASED) == 0);
-       KASSERT(!UVM_OBJ_IS_CLEAN(curpg->uobject) ||
-           (curpg->flags & PG_CLEAN) != 0);
-       readonly = (curpg->flags & PG_RDONLY)
-           || (curpg->loan_count > 0)
-           || UVM_OBJ_NEEDS_WRITEFAULT(curpg->uobject);
+       KASSERT((pg->flags & PG_PAGEOUT) == 0);
+       KASSERT((pg->flags & PG_RELEASED) == 0);
+       KASSERT(!UVM_OBJ_IS_CLEAN(pg->uobject) ||
+           (pg->flags & PG_CLEAN) != 0);
 
        (void) pmap_enter(ufi->orig_map->pmap, currva,
-           VM_PAGE_TO_PHYS(curpg),
-           readonly ?  flt->enter_prot & ~VM_PROT_WRITE :
+           VM_PAGE_TO_PHYS(pg),
+           readonly ? (flt->enter_prot & ~VM_PROT_WRITE) :
            flt->enter_prot & MASK(ufi->entry),
            PMAP_CANFAIL | (flt->wire_mapping ? PMAP_WIRED : 0));
 
@@ -1355,11 +1361,11 @@
         * NOTE: page can't be PG_WANTED or PG_RELEASED because we've
         * held the lock the whole time we've had the handle.
         */
-       KASSERT((curpg->flags & PG_WANTED) == 0);
-       KASSERT((curpg->flags & PG_RELEASED) == 0);
+       KASSERT((pg->flags & PG_WANTED) == 0);
+       KASSERT((pg->flags & PG_RELEASED) == 0);
 
-       curpg->flags &= ~(PG_BUSY);
-       UVM_PAGE_OWN(curpg, NULL);
+       pg->flags &= ~(PG_BUSY);
+       UVM_PAGE_OWN(pg, NULL);
 }
 
 static int
@@ -1865,11 +1871,6 @@
        return 0;
 }
 
-static int
-uvm_fault_lower_generic_direct_loan(
-       struct uvm_faultinfo *ufi, struct uvm_faultctx *flt,
-       struct uvm_object *uobj, struct vm_page **rpg, struct vm_page **ruobjpage);
-
 int
 uvm_fault_lower_generic_direct(
        struct uvm_faultinfo *ufi, struct uvm_faultctx *flt,



Home | Main Index | Thread Index | Old Index