summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2009-10-26 00:01:52 +0000
committeralc <alc@FreeBSD.org>2009-10-26 00:01:52 +0000
commitd4f827eb7aac16e5c12a421026362bdcbdf6ac97 (patch)
tree6a0dea221e0276eee3081579028391febe61eb40 /sys/vm
parent37ff8c89148013cc5a60edcc3dd04adc3438ce93 (diff)
downloadFreeBSD-src-d4f827eb7aac16e5c12a421026362bdcbdf6ac97.zip
FreeBSD-src-d4f827eb7aac16e5c12a421026362bdcbdf6ac97.tar.gz
Simplify the inner loop of vm_fault_copy_entry().
Reviewed by: kib
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/vm_fault.c25
1 files changed, 12 insertions, 13 deletions
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index 4314fda..508d617 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -1133,20 +1133,20 @@ vm_fault_copy_entry(vm_map_t dst_map, vm_map_t src_map,
{
vm_object_t backing_object, dst_object, object;
vm_object_t src_object;
- vm_ooffset_t dst_offset;
- vm_ooffset_t src_offset;
- vm_pindex_t pindex;
+ vm_pindex_t dst_pindex, pindex, src_pindex;
vm_prot_t prot;
vm_offset_t vaddr;
vm_page_t dst_m;
vm_page_t src_m;
+ boolean_t src_readonly;
#ifdef lint
src_map++;
#endif /* lint */
src_object = src_entry->object.vm_object;
- src_offset = src_entry->offset;
+ 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
@@ -1177,16 +1177,16 @@ vm_fault_copy_entry(vm_map_t dst_map, vm_map_t src_map,
* one from the source object (it should be there) to the destination
* object.
*/
- for (vaddr = dst_entry->start, dst_offset = 0;
+ for (vaddr = dst_entry->start, dst_pindex = 0;
vaddr < dst_entry->end;
- vaddr += PAGE_SIZE, dst_offset += PAGE_SIZE) {
+ vaddr += PAGE_SIZE, dst_pindex++) {
/*
- * Allocate a page in the destination object
+ * Allocate a page in the destination object.
*/
do {
- dst_m = vm_page_alloc(dst_object,
- OFF_TO_IDX(dst_offset), VM_ALLOC_NORMAL);
+ dst_m = vm_page_alloc(dst_object, dst_pindex,
+ VM_ALLOC_NORMAL);
if (dst_m == NULL) {
VM_OBJECT_UNLOCK(dst_object);
VM_WAIT;
@@ -1201,10 +1201,9 @@ vm_fault_copy_entry(vm_map_t dst_map, vm_map_t src_map,
*/
VM_OBJECT_LOCK(src_object);
object = src_object;
- pindex = 0;
- while ((src_m = vm_page_lookup(object, pindex +
- OFF_TO_IDX(dst_offset + src_offset))) == NULL &&
- (src_entry->protection & VM_PROT_WRITE) == 0 &&
+ 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.
OpenPOWER on IntegriCloud