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 <[email protected]>
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);
/*