Source-Changes-HG archive

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

[src/trunk]: src/sys/uvm uvm_fault_internal:



details:   https://anonhg.NetBSD.org/src/rev/ea08b9b29ae3
branches:  trunk
changeset: 751292:ea08b9b29ae3
user:      uebayasi <uebayasi%NetBSD.org@localhost>
date:      Sun Jan 31 09:20:31 2010 +0000

description:
uvm_fault_internal:

Move local variables around to isolate contexts.  Note that remaining variables
are global in that function, and some hold state across re-fault.

Slilently clean-up the "eoff" mess.

(Superfluous braces will go once things settle down.)

diffstat:

 sys/uvm/uvm_fault.c |  74 ++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 59 insertions(+), 15 deletions(-)

diffs (230 lines):

diff -r c4ad69b189b7 -r ea08b9b29ae3 sys/uvm/uvm_fault.c
--- a/sys/uvm/uvm_fault.c       Sun Jan 31 07:47:29 2010 +0000
+++ b/sys/uvm/uvm_fault.c       Sun Jan 31 09:20:31 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: uvm_fault.c,v 1.136 2010/01/31 07:47:29 uebayasi Exp $ */
+/*     $NetBSD: uvm_fault.c,v 1.137 2010/01/31 09:20:31 uebayasi Exp $ */
 
 /*
  *
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.136 2010/01/31 07:47:29 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.137 2010/01/31 09:20:31 uebayasi Exp $");
 
 #include "opt_uvmhist.h"
 
@@ -697,23 +697,21 @@
     vm_prot_t access_type, int fault_flag)
 {
        struct uvm_faultinfo ufi;
-       vm_prot_t enter_prot, check_prot;
-       bool wired, narrow, promote, locked, shadowed, wire_fault, cow_now;
-       int npages, nback, nforw, centeridx, error, lcv, gotpages;
-       vaddr_t startva, currva;
-       voff_t uoff;
+       vm_prot_t enter_prot;
+       bool wired, narrow, shadowed, wire_fault, cow_now;
+       int npages, centeridx, error;
+       vaddr_t startva;
        struct vm_amap *amap;
        struct uvm_object *uobj;
-       struct vm_anon *anons_store[UVM_MAXRANGE], **anons, *anon, *oanon;
+       struct vm_anon *anons_store[UVM_MAXRANGE], **anons;
        struct vm_anon *anon_spare;
-       struct vm_page *pages[UVM_MAXRANGE], *pg, *uobjpage;
+       struct vm_page *pages[UVM_MAXRANGE], *uobjpage;
        UVMHIST_FUNC("uvm_fault"); UVMHIST_CALLED(maphist);
 
        UVMHIST_LOG(maphist, "(map=0x%x, vaddr=0x%x, at=%d, ff=%d)",
              orig_map, vaddr, access_type, fault_flag);
 
-       anon = anon_spare = NULL;
-       pg = NULL;
+       anon_spare = NULL;
 
        uvmexp.faults++;        /* XXX: locking? */
 
@@ -736,6 +734,11 @@
         */
 ReFault:
 
+/* uvm_fault_prepare */
+    {
+       vm_prot_t check_prot;
+       int nback, nforw;
+
        /*
         * lookup and lock the maps
         */
@@ -873,7 +876,7 @@
 
        }
        /* offset from entry's start to pgs' start */
-       voff_t eoff = startva - ufi.entry->start;
+       const voff_t eoff = startva - ufi.entry->start;
 
        /* locked: maps(read) */
        UVMHIST_LOG(maphist, "  narrow=%d, back=%d, forw=%d, startva=0x%x",
@@ -911,6 +914,8 @@
 
                /* flush object? */
                if (uobj) {
+                       voff_t uoff;
+
                        uoff = ufi.entry->offset + eoff;
                        mutex_enter(&uobj->vmobjlock);
                        (void) (uobj->pgops->pgo_put)(uobj, uoff, uoff +
@@ -922,9 +927,19 @@
                        anons += nback;
                startva += (nback << PAGE_SHIFT);
                npages -= nback;
-               nback = centeridx = 0;
-               eoff = startva - ufi.entry->start;
+               centeridx = 0;
        }
+    }
+
+       /*
+        * => startva is fixed
+        * => npages is fixed
+        */
+
+/* uvm_fault_upper_lookup */
+    {
+       int lcv;
+       vaddr_t currva;
 
        /* locked: maps(read), amap(if there) */
        KASSERT(amap == NULL || mutex_owned(&amap->am_l));
@@ -938,6 +953,7 @@
        currva = startva;
        shadowed = false;
        for (lcv = 0 ; lcv < npages ; lcv++, currva += PAGE_SIZE) {
+               struct vm_anon *anon;
 
                /*
                 * dont play with VAs that are already mapped
@@ -1009,10 +1025,12 @@
         * XXX Actually, that is bad; pmap_enter() should just fail in that
         * XXX case.  --thorpej
         */
+    }
 
        if (shadowed == true)
                goto Case1;
 
+/* uvm_fault_lower */
        /*
         * if the desired page is not shadowed by the amap and we have a
         * backing object, then we check to see if the backing object would
@@ -1022,6 +1040,7 @@
         */
 
        if (uobj && uobj->pgops->pgo_fault != NULL) {
+/* uvm_fault_lower_special */
                mutex_enter(&uobj->vmobjlock);
                /* locked: maps(read), amap (if there), uobj */
                error = uobj->pgops->pgo_fault(&ufi, startva, pages, npages,
@@ -1037,6 +1056,11 @@
                goto done;
        }
 
+/* uvm_fault_lower_generic_lookup */
+    {
+       int lcv, gotpages;
+       vaddr_t currva;
+
        /*
         * now, if the desired page is not shadowed by the amap and we have
         * a backing object that does not have a special fault routine, then
@@ -1059,7 +1083,7 @@
 
        uvmexp.fltlget++;
        gotpages = npages;
-       (void) uobj->pgops->pgo_get(uobj, ufi.entry->offset + eoff,
+       (void) uobj->pgops->pgo_get(uobj, ufi.entry->offset + startva - ufi.entry->start,
                        pages, &gotpages, centeridx,
                        access_type & MASK(ufi.entry),
                        ufi.entry->advice, PGO_LOCKED);
@@ -1153,6 +1177,7 @@
 
 lower_fault_lookup_done:
        {}
+    }
 
        /* locked: maps(read), amap(if there), uobj(if !null), uobjpage(if !null) */
        KASSERT(!shadowed);
@@ -1181,7 +1206,11 @@
 
        goto Case2;
 
+/* uvm_fault_upper */
 Case1:
+    {
+       struct vm_anon *anon, *oanon;
+
        /* locked: maps(read), amap */
        KASSERT(mutex_owned(&amap->am_l));
 
@@ -1269,6 +1298,7 @@
 
                        /* >1 case is already ok */
                        if (anon->an_ref == 1) {
+                               struct vm_page *pg;
 
                                /* get new un-owned replacement page */
                                pg = uvm_pagealloc(NULL, 0, NULL, 0);
@@ -1339,6 +1369,7 @@
         * if we are out of anon VM we kill the process (XXX: could wait?).
         */
 
+       struct vm_page *pg;
        if (cow_now && anon->an_ref > 1) {
 
                UVMHIST_LOG(maphist, "  case 1B: COW fault",0,0,0,0);
@@ -1452,8 +1483,14 @@
        pmap_update(ufi.orig_map->pmap);
        error = 0;
        goto done;
+    }
 
+/* uvm_fault_lower_generic */
 Case2:
+    {
+       struct vm_anon *anon;
+       bool promote;
+
        /*
         * handle case 2: faulting on backing object or zero fill
         */
@@ -1496,6 +1533,10 @@
                /* update rusage counters */
                curlwp->l_ru.ru_minflt++;
        } else {
+               bool locked;
+               int gotpages;
+               voff_t uoff;
+
                /* update rusage counters */
                curlwp->l_ru.ru_majflt++;
 
@@ -1613,6 +1654,7 @@
        KASSERT(uobj == NULL || uobj == uobjpage->uobject);
        KASSERT(uobj == NULL || !UVM_OBJ_IS_CLEAN(uobjpage->uobject) ||
            (uobjpage->flags & PG_CLEAN) != 0);
+       struct vm_page *pg;
        if (promote == false) {
 
                /*
@@ -1840,6 +1882,8 @@
        pmap_update(ufi.orig_map->pmap);
        UVMHIST_LOG(maphist, "<- done (SUCCESS!)",0,0,0,0);
        error = 0;
+    }
+
 done:
        if (anon_spare != NULL) {
                anon_spare->an_ref--;



Home | Main Index | Thread Index | Old Index