svn commit: r355764 - head/sys/vm
Jeff Roberson
jeff at FreeBSD.org
Sun Dec 15 02:02:27 UTC 2019
Author: jeff
Date: Sun Dec 15 02:02:27 2019
New Revision: 355764
URL: https://svnweb.freebsd.org/changeset/base/355764
Log:
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
Modified:
head/sys/vm/vm_map.c
Modified: head/sys/vm/vm_map.c
==============================================================================
--- head/sys/vm/vm_map.c Sun Dec 15 02:00:32 2019 (r355763)
+++ head/sys/vm/vm_map.c Sun Dec 15 02:02:27 2019 (r355764)
@@ -3870,15 +3870,19 @@ vm_map_copy_swap_object(vm_map_entry_t src_entry, vm_m
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_m
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;
More information about the svn-src-all
mailing list