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;
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to