Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 25 Feb 2012 17:49:59 +0000 (UTC)
From:      Alan Cox <alc@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r232160 - head/sys/vm
Message-ID:  <201202251749.q1PHnx9E027525@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: alc
Date: Sat Feb 25 17:49:59 2012
New Revision: 232160
URL: http://svn.freebsd.org/changeset/base/232160

Log:
  Simplify vmspace_fork()'s control flow by copying immutable data before
  the vm map locks are acquired.  Also, eliminate redundant initialization
  of the new vm map's timestamp.
  
  Reviewed by:	kib
  MFC after:	3 weeks

Modified:
  head/sys/vm/vm_map.c

Modified: head/sys/vm/vm_map.c
==============================================================================
--- head/sys/vm/vm_map.c	Sat Feb 25 16:02:12 2012	(r232159)
+++ head/sys/vm/vm_map.c	Sat Feb 25 17:49:59 2012	(r232160)
@@ -3082,27 +3082,25 @@ struct vmspace *
 vmspace_fork(struct vmspace *vm1, vm_ooffset_t *fork_charge)
 {
 	struct vmspace *vm2;
-	vm_map_t old_map = &vm1->vm_map;
-	vm_map_t new_map;
-	vm_map_entry_t old_entry;
-	vm_map_entry_t new_entry;
+	vm_map_t new_map, old_map;
+	vm_map_entry_t new_entry, old_entry;
 	vm_object_t object;
 	int locked;
 
-	vm_map_lock(old_map);
-	if (old_map->busy)
-		vm_map_wait_busy(old_map);
-	new_map = NULL; /* silence gcc */
+	old_map = &vm1->vm_map;
+	/* Copy immutable fields of vm1 to vm2. */
 	vm2 = vmspace_alloc(old_map->min_offset, old_map->max_offset);
 	if (vm2 == NULL)
-		goto unlock_and_return;
+		return (NULL);
 	vm2->vm_taddr = vm1->vm_taddr;
 	vm2->vm_daddr = vm1->vm_daddr;
 	vm2->vm_maxsaddr = vm1->vm_maxsaddr;
-	new_map = &vm2->vm_map;	/* XXX */
+	vm_map_lock(old_map);
+	if (old_map->busy)
+		vm_map_wait_busy(old_map);
+	new_map = &vm2->vm_map;
 	locked = vm_map_trylock(new_map); /* trylock to silence WITNESS */
 	KASSERT(locked, ("vmspace_fork: lock failed"));
-	new_map->timestamp = 1;
 
 	old_entry = old_map->header.next;
 
@@ -3223,15 +3221,13 @@ vmspace_fork(struct vmspace *vm1, vm_oof
 		}
 		old_entry = old_entry->next;
 	}
-unlock_and_return:
 	/*
 	 * Use inlined vm_map_unlock() to postpone handling the deferred
 	 * map entries, which cannot be done until both old_map and
 	 * new_map locks are released.
 	 */
 	sx_xunlock(&old_map->lock);
-	if (vm2 != NULL)
-		sx_xunlock(&new_map->lock);
+	sx_xunlock(&new_map->lock);
 	vm_map_process_deferred();
 
 	return (vm2);



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