svn commit: r265315 - stable/9/sys/vm
Konstantin Belousov
kib at FreeBSD.org
Sun May 4 08:00:07 UTC 2014
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;
More information about the svn-src-stable-9
mailing list