Module Name:    src
Committed By:   hannken
Date:           Mon Jun 27 15:56:37 UTC 2011

Modified Files:
        src/sys/uvm: uvm_amap.c

Log Message:
amap_copy(): Keep the source amap locked until its lock has been copied.

Kernel assertion "anon->an_lock == amap->am_lock" no longer fails.

Ok: Mindaugas Rasiukevicius <rm...@netbsd.org>


To generate a diff of this commit:
cvs rdiff -u -r1.99 -r1.100 src/sys/uvm/uvm_amap.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/uvm/uvm_amap.c
diff -u src/sys/uvm/uvm_amap.c:1.99 src/sys/uvm/uvm_amap.c:1.100
--- src/sys/uvm/uvm_amap.c:1.99	Fri Jun 24 01:48:43 2011
+++ src/sys/uvm/uvm_amap.c	Mon Jun 27 15:56:36 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_amap.c,v 1.99 2011/06/24 01:48:43 rmind Exp $	*/
+/*	$NetBSD: uvm_amap.c,v 1.100 2011/06/27 15:56:36 hannken Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_amap.c,v 1.99 2011/06/24 01:48:43 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_amap.c,v 1.100 2011/06/27 15:56:36 hannken Exp $");
 
 #include "opt_uvmhist.h"
 
@@ -766,7 +766,6 @@
 	const int waitf = (flags & AMAP_COPY_NOWAIT) ? UVM_FLAG_NOWAIT : 0;
 	struct vm_amap *amap, *srcamap;
 	struct vm_anon *tofree;
-	kmutex_t *lock;
 	u_int slots, lcv;
 	vsize_t len;
 
@@ -900,7 +899,7 @@
 	/*
 	 * Drop our reference to the old amap (srcamap) and unlock.
 	 * Since the reference count on srcamap is greater than one,
-	 * (we checked above), it cannot drop to zero.
+	 * (we checked above), it cannot drop to zero while it is locked.
 	 */
 
 	srcamap->am_ref--;
@@ -917,20 +916,20 @@
 	}
 #endif
 	uvm_anfree(tofree);
-	amap_unlock(srcamap);
 
 	/*
 	 * If we referenced any anons, then share the source amap's lock.
 	 * Otherwise, we have nothing in common, so allocate a new one.
 	 */
 
+	KASSERT(amap->am_lock == NULL);
 	if (amap->am_nused != 0) {
-		lock = srcamap->am_lock;
-		mutex_obj_hold(lock);
-	} else {
-		lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NONE);
-	}		
-	amap->am_lock = lock;
+		amap->am_lock = srcamap->am_lock;
+		mutex_obj_hold(amap->am_lock);
+	}
+	amap_unlock(srcamap);
+	if (amap->am_lock == NULL)
+		amap->am_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NONE);
 	amap_list_insert(amap);
 
 	/*

Reply via email to