Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 15 Dec 2019 02:02:27 +0000 (UTC)
From:      Jeff Roberson <jeff@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r355764 - head/sys/vm
Message-ID:  <201912150202.xBF22R6d052432@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201912150202.xBF22R6d052432>