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); /*