Diff below moves `access_type' to the context structure passed down to
the various routines and fix a regression introduced in a previous
refactoring.

`access_type' is overwritten for wired mapping and the value of
`enter_prot' is used instead.

ok?

Index: uvm/uvm_fault.c
===================================================================
RCS file: /cvs/src/sys/uvm/uvm_fault.c,v
retrieving revision 1.111
diff -u -p -r1.111 uvm_fault.c
--- uvm/uvm_fault.c     2 Jan 2021 02:39:59 -0000       1.111
+++ uvm/uvm_fault.c     12 Jan 2021 12:36:38 -0000
@@ -477,6 +477,7 @@ struct uvm_faultctx {
         * read-only after that.
         */
        vm_prot_t enter_prot;
+       vm_prot_t access_type;
        vaddr_t startva;
        int npages;
        int centeridx;
@@ -486,7 +487,7 @@ struct uvm_faultctx {
 };
 
 int    uvm_fault_lower(struct uvm_faultinfo *, struct uvm_faultctx *,
-           struct vm_page **, vm_fault_t, vm_prot_t);
+           struct vm_page **, vm_fault_t);
 
 /*
  * uvm_fault_check: check prot, handle needs-copy, etc.
@@ -505,7 +506,7 @@ int uvm_fault_lower(struct uvm_faultinfo
  */
 int
 uvm_fault_check(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt,
-    struct vm_anon ***ranons, vm_prot_t access_type)
+    struct vm_anon ***ranons)
 {
        struct vm_amap *amap;
        struct uvm_object *uobj;
@@ -523,7 +524,7 @@ uvm_fault_check(struct uvm_faultinfo *uf
 #endif
 
        /* check protection */
-       if ((ufi->entry->protection & access_type) != access_type) {
+       if ((ufi->entry->protection & flt->access_type) != flt->access_type) {
                uvmfault_unlockmaps(ufi, FALSE);
                return (EACCES);
        }
@@ -539,11 +540,11 @@ uvm_fault_check(struct uvm_faultinfo *uf
        flt->pa_flags = UVM_ET_ISWC(ufi->entry) ? PMAP_WC : 0;
        flt->wired = VM_MAPENT_ISWIRED(ufi->entry) || (flt->narrow == TRUE);
        if (flt->wired)
-               access_type = flt->enter_prot; /* full access for wired */
+               flt->access_type = flt->enter_prot; /* full access for wired */
 
        /* handle "needs_copy" case. */
        if (UVM_ET_ISNEEDSCOPY(ufi->entry)) {
-               if ((access_type & PROT_WRITE) ||
+               if ((flt->access_type & PROT_WRITE) ||
                    (ufi->entry->object.uvm_obj == NULL)) {
                        /* need to clear */
                        uvmfault_unlockmaps(ufi, FALSE);
@@ -648,7 +649,7 @@ uvm_fault_check(struct uvm_faultinfo *uf
  */
 int
 uvm_fault_upper(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt,
-   struct vm_anon **anons, vm_fault_t fault_type, vm_prot_t access_type)
+   struct vm_anon **anons, vm_fault_t fault_type)
 {
        struct vm_amap *amap = ufi->entry->aref.ar_amap;
        struct vm_anon *oanon, *anon = anons[flt->centeridx];
@@ -699,7 +700,7 @@ uvm_fault_upper(struct uvm_faultinfo *uf
         * if we are out of anon VM we wait for RAM to become available.
         */
 
-       if ((access_type & PROT_WRITE) != 0 && anon->an_ref > 1) {
+       if ((flt->access_type & PROT_WRITE) != 0 && anon->an_ref > 1) {
                counters_inc(uvmexp_counters, flt_acow);
                oanon = anon;           /* oanon = old */
                anon = uvm_analloc();
@@ -761,7 +762,7 @@ uvm_fault_upper(struct uvm_faultinfo *uf
         */
        if (pmap_enter(ufi->orig_map->pmap, ufi->orig_rvaddr,
            VM_PAGE_TO_PHYS(pg) | flt->pa_flags, flt->enter_prot,
-           access_type | PMAP_CANFAIL | (flt->wired ? PMAP_WIRED : 0)) != 0) {
+           flt->access_type | PMAP_CANFAIL | (flt->wired ? PMAP_WIRED : 0)) != 
0) {
                /*
                 * No need to undo what we did; we can simply think of
                 * this as the pmap throwing away the mapping information.
@@ -922,6 +923,7 @@ uvm_fault(vm_map_t orig_map, vaddr_t vad
                                         * pages on wire */
        else
                flt.narrow = FALSE;     /* normal fault */
+       flt.access_type = access_type;
 
 
        /*
@@ -930,7 +932,7 @@ uvm_fault(vm_map_t orig_map, vaddr_t vad
        while (error == ERESTART) {
                anons = anons_store;
 
-               error = uvm_fault_check(&ufi, &flt, &anons, access_type);
+               error = uvm_fault_check(&ufi, &flt, &anons);
                if (error != 0)
                        continue;
 
@@ -938,13 +940,11 @@ uvm_fault(vm_map_t orig_map, vaddr_t vad
                shadowed = uvm_fault_upper_lookup(&ufi, &flt, anons, pages);
                if (shadowed == TRUE) {
                        /* case 1: fault on an anon in our amap */
-                       error = uvm_fault_upper(&ufi, &flt, anons, fault_type,
-                           access_type);
+                       error = uvm_fault_upper(&ufi, &flt, anons, fault_type);
                } else {
                        /* case 2: fault on backing object or zero fill */
                        KERNEL_LOCK();
-                       error = uvm_fault_lower(&ufi, &flt, pages, fault_type,
-                           access_type);
+                       error = uvm_fault_lower(&ufi, &flt, pages, fault_type);
                        KERNEL_UNLOCK();
                }
        }
@@ -954,7 +954,7 @@ uvm_fault(vm_map_t orig_map, vaddr_t vad
 
 int
 uvm_fault_lower(struct uvm_faultinfo *ufi, struct uvm_faultctx *flt,
-   struct vm_page **pages, vm_fault_t fault_type, vm_prot_t access_type)
+   struct vm_page **pages, vm_fault_t fault_type)
 {
        struct vm_amap *amap = ufi->entry->aref.ar_amap;
        struct uvm_object *uobj = ufi->entry->object.uvm_obj;
@@ -974,7 +974,7 @@ uvm_fault_lower(struct uvm_faultinfo *uf
         */
        if (uobj != NULL && uobj->pgops->pgo_fault != NULL) {
                result = uobj->pgops->pgo_fault(ufi, flt->startva, pages,
-                   flt->npages, flt->centeridx, fault_type, access_type,
+                   flt->npages, flt->centeridx, fault_type, flt->access_type,
                    PGO_LOCKED);
 
                if (result == VM_PAGER_OK)
@@ -1000,7 +1000,7 @@ uvm_fault_lower(struct uvm_faultinfo *uf
                (void) uobj->pgops->pgo_get(uobj, ufi->entry->offset +
                                (flt->startva - ufi->entry->start),
                                pages, &gotpages, flt->centeridx,
-                               access_type & MASK(ufi->entry),
+                               flt->access_type & MASK(ufi->entry),
                                ufi->entry->advice, PGO_LOCKED);
 
                /* check for pages to map, if we got any */
@@ -1089,7 +1089,7 @@ uvm_fault_lower(struct uvm_faultinfo *uf
                promote = TRUE;         /* always need anon here */
        } else {
                KASSERT(uobjpage != PGO_DONTCARE);
-               promote = (access_type & PROT_WRITE) &&
+               promote = (flt->access_type & PROT_WRITE) &&
                     UVM_ET_ISCOPYONWRITE(ufi->entry);
        }
 
@@ -1114,7 +1114,7 @@ uvm_fault_lower(struct uvm_faultinfo *uf
                gotpages = 1;
                uoff = (ufi->orig_rvaddr - ufi->entry->start) + 
ufi->entry->offset;
                result = uobj->pgops->pgo_get(uobj, uoff, &uobjpage, &gotpages,
-                   0, access_type & MASK(ufi->entry), ufi->entry->advice,
+                   0, flt->access_type & MASK(ufi->entry), ufi->entry->advice,
                    PGO_SYNCIO);
 
                /* recover from I/O */
@@ -1308,7 +1308,7 @@ uvm_fault_lower(struct uvm_faultinfo *uf
         */
        if (pmap_enter(ufi->orig_map->pmap, ufi->orig_rvaddr,
            VM_PAGE_TO_PHYS(pg) | flt->pa_flags, flt->enter_prot,
-           access_type | PMAP_CANFAIL | (flt->wired ? PMAP_WIRED : 0)) != 0) {
+           flt->access_type | PMAP_CANFAIL | (flt->wired ? PMAP_WIRED : 0)) != 
0) {
                /*
                 * No need to undo what we did; we can simply think of
                 * this as the pmap throwing away the mapping information.

Reply via email to