mirror of
https://git.FreeBSD.org/src.git
synced 2024-10-19 02:29:40 +00:00
Slightly optimize locking in vm_map_copy_swap_entry(). Anonymous objects
require the object lock to synchronize collapse. Other swap objects such as tmpfs do not. Reported by: mjg Reviewed by: kib, markj Differential Revision: https://reviews.freebsd.org/D22747
This commit is contained in:
parent
af00971419
commit
d966c7615f
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=355764
@ -3870,15 +3870,19 @@ vm_map_copy_swap_object(vm_map_entry_t src_entry, vm_map_entry_t dst_entry,
|
||||
int charged;
|
||||
|
||||
src_object = src_entry->object.vm_object;
|
||||
VM_OBJECT_WLOCK(src_object);
|
||||
charged = ENTRY_CHARGED(src_entry);
|
||||
vm_object_collapse(src_object);
|
||||
if ((src_object->flags & OBJ_ONEMAPPING) != 0) {
|
||||
vm_object_split(src_entry);
|
||||
src_object = src_entry->object.vm_object;
|
||||
}
|
||||
vm_object_reference_locked(src_object);
|
||||
vm_object_clear_flag(src_object, OBJ_ONEMAPPING);
|
||||
if ((src_object->flags & OBJ_ANON) != 0) {
|
||||
VM_OBJECT_WLOCK(src_object);
|
||||
vm_object_collapse(src_object);
|
||||
if ((src_object->flags & OBJ_ONEMAPPING) != 0) {
|
||||
vm_object_split(src_entry);
|
||||
src_object = src_entry->object.vm_object;
|
||||
}
|
||||
vm_object_reference_locked(src_object);
|
||||
vm_object_clear_flag(src_object, OBJ_ONEMAPPING);
|
||||
VM_OBJECT_WUNLOCK(src_object);
|
||||
} else
|
||||
vm_object_reference(src_object);
|
||||
if (src_entry->cred != NULL &&
|
||||
!(src_entry->eflags & MAP_ENTRY_NEEDS_COPY)) {
|
||||
KASSERT(src_object->cred == NULL,
|
||||
@ -3887,7 +3891,6 @@ vm_map_copy_swap_object(vm_map_entry_t src_entry, vm_map_entry_t dst_entry,
|
||||
src_object->cred = src_entry->cred;
|
||||
src_object->charge = size;
|
||||
}
|
||||
VM_OBJECT_WUNLOCK(src_object);
|
||||
dst_entry->object.vm_object = src_object;
|
||||
if (charged) {
|
||||
cred = curthread->td_ucred;
|
||||
|
Loading…
Reference in New Issue
Block a user