Author: kib
Date: Sun May  4 08:00:07 2014
New Revision: 265315
URL: http://svnweb.freebsd.org/changeset/base/265315

Log:
  MFC r265002:
  Fix vm_fault_copy_entry() operation on upgrade; allow it to find the
  pages in the shadowed objects.

Modified:
  stable/9/sys/vm/vm_fault.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/vm/vm_fault.c
==============================================================================
--- stable/9/sys/vm/vm_fault.c  Sun May  4 07:57:20 2014        (r265314)
+++ stable/9/sys/vm/vm_fault.c  Sun May  4 08:00:07 2014        (r265315)
@@ -1271,7 +1271,7 @@ vm_fault_copy_entry(vm_map_t dst_map, vm
        vm_offset_t vaddr;
        vm_page_t dst_m;
        vm_page_t src_m;
-       boolean_t src_readonly, upgrade;
+       boolean_t upgrade;
 
 #ifdef lint
        src_map++;
@@ -1281,7 +1281,6 @@ vm_fault_copy_entry(vm_map_t dst_map, vm
 
        src_object = src_entry->object.vm_object;
        src_pindex = OFF_TO_IDX(src_entry->offset);
-       src_readonly = (src_entry->protection & VM_PROT_WRITE) == 0;
 
        /*
         * Create the top-level object for the destination entry. (Doesn't
@@ -1352,25 +1351,33 @@ vm_fault_copy_entry(vm_map_t dst_map, vm
 
                /*
                 * Find the page in the source object, and copy it in.
-                * (Because the source is wired down, the page will be in
-                * memory.)
+                * Because the source is wired down, the page will be
+                * in memory.
                 */
                VM_OBJECT_LOCK(src_object);
                object = src_object;
                pindex = src_pindex + dst_pindex;
                while ((src_m = vm_page_lookup(object, pindex)) == NULL &&
-                   src_readonly &&
                    (backing_object = object->backing_object) != NULL) {
                        /*
-                        * Allow fallback to backing objects if we are reading.
+                        * Unless the source mapping is read-only or
+                        * it is presently being upgraded from
+                        * read-only, the first object in the shadow
+                        * chain should provide all of the pages.  In
+                        * other words, this loop body should never be
+                        * executed when the source mapping is already
+                        * read/write.
                         */
+                       KASSERT((src_entry->protection & VM_PROT_WRITE) == 0 ||
+                           upgrade,
+                           ("vm_fault_copy_entry: main object missing page"));
+
                        VM_OBJECT_LOCK(backing_object);
                        pindex += OFF_TO_IDX(object->backing_object_offset);
                        VM_OBJECT_UNLOCK(object);
                        object = backing_object;
                }
-               if (src_m == NULL)
-                       panic("vm_fault_copy_wired: page missing");
+               KASSERT(src_m != NULL, ("vm_fault_copy_entry: page missing"));
                pmap_copy_page(src_m, dst_m);
                VM_OBJECT_UNLOCK(object);
                dst_m->valid = VM_PAGE_BITS_ALL;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to