summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_fault.c
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2013-05-17 19:02:36 +0000
committeralc <alc@FreeBSD.org>2013-05-17 19:02:36 +0000
commitd5c05f4a928a30d6ad1334e26d6890e038377c7c (patch)
tree43c46c9e0716e6568a5ba0b16477cdf80ec0c7f1 /sys/vm/vm_fault.c
parentb55ba81a923ec8249c7d2fa1b3293816d5e8ef96 (diff)
downloadFreeBSD-src-d5c05f4a928a30d6ad1334e26d6890e038377c7c.zip
FreeBSD-src-d5c05f4a928a30d6ad1334e26d6890e038377c7c.tar.gz
Relax the object locking in vm_fault_prefault(). A read lock suffices.
Reviewed by: attilio Sponsored by: EMC / Isilon Storage Division
Diffstat (limited to 'sys/vm/vm_fault.c')
-rw-r--r--sys/vm/vm_fault.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index 6c41c07..1313bc8 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -1044,28 +1044,28 @@ vm_fault_prefault(pmap_t pmap, vm_offset_t addra, vm_map_entry_t entry)
pindex = ((addr - entry->start) + entry->offset) >> PAGE_SHIFT;
lobject = object;
- VM_OBJECT_WLOCK(lobject);
+ VM_OBJECT_RLOCK(lobject);
while ((m = vm_page_lookup(lobject, pindex)) == NULL &&
lobject->type == OBJT_DEFAULT &&
(backing_object = lobject->backing_object) != NULL) {
KASSERT((lobject->backing_object_offset & PAGE_MASK) ==
0, ("vm_fault_prefault: unaligned object offset"));
pindex += lobject->backing_object_offset >> PAGE_SHIFT;
- VM_OBJECT_WLOCK(backing_object);
- VM_OBJECT_WUNLOCK(lobject);
+ VM_OBJECT_RLOCK(backing_object);
+ VM_OBJECT_RUNLOCK(lobject);
lobject = backing_object;
}
/*
* give-up when a page is not in memory
*/
if (m == NULL) {
- VM_OBJECT_WUNLOCK(lobject);
+ VM_OBJECT_RUNLOCK(lobject);
break;
}
if (m->valid == VM_PAGE_BITS_ALL &&
(m->flags & PG_FICTITIOUS) == 0)
pmap_enter_quick(pmap, addr, m, entry->protection);
- VM_OBJECT_WUNLOCK(lobject);
+ VM_OBJECT_RUNLOCK(lobject);
}
}
OpenPOWER on IntegriCloud