diff options
author | alc <alc@FreeBSD.org> | 2013-05-17 19:02:36 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2013-05-17 19:02:36 +0000 |
commit | d5c05f4a928a30d6ad1334e26d6890e038377c7c (patch) | |
tree | 43c46c9e0716e6568a5ba0b16477cdf80ec0c7f1 /sys/vm/vm_fault.c | |
parent | b55ba81a923ec8249c7d2fa1b3293816d5e8ef96 (diff) | |
download | FreeBSD-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.c | 10 |
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); } } |