Subject: Re: i386 current: simple_lock: unitialized lock
To: Erik Bertelsen <bertelsen.erik@gmail.com>
From: Antti Kantee <pooka@cs.hut.fi>
List: current-users
Date: 07/29/2007 00:10:04
On Sat Jul 28 2007 at 23:02:53 +0200, Erik Bertelsen wrote:
> simple_lock: unitialized lock
> lock: 0xd918f57c, currently at: ../../../../kern/kern_synch.c:184
> uvm_fault(0xc047c6c0, 0xdeadb000, 1) -> 0
> Stopped in pid 0.21 (system) at netbsd:kprintf+0x8a6: repne scasb (%esi)
> db> t
> kprintf(c03e8150,8,cca458d8,cca458fe,cca459ac) at netbsd:kprintf+0x8a6
> vsnprintf(cca458fe,96,c03e8150,cca459a8,39647830) at netbsd:vsnprintf+0x38
> lock_printf(c03e8150,deadbeef,ffffbeef,d,c) at netbsd:lock_printf+0x43
> _simple_lock(d918f57c ,c03e9007,,b8,0,460) at netbsd:_simple_lock:+0x7b
> ltsleep(d918f57c,14,c03ebd71,0,d918f57c) at netbsd:lpsleep+0x164
> acquire(0,600,c01df4b6,5207,10012) at netbsd:acquire+0x104
> _lockmgr(d918f57c,10002,d918f4ec,c041290c,8fd) at netbsd:_lockmgr+0x737
> ufs_lock(cca45b00,cf5a740c,cca45b1bc,10012,d918f4ec) at netbsd:ufs_lock+0x3a
> VOP_LOCK(d918f4ec,10002,0,d918f4ec,d918f4ec) at netbsd:VOP_LOCK+0x23
> vn_lock(d918f4ec,10002,50b,d918f544,10) at netbsd_v n_lock+0x96
> vrele(d918f4ec,10012,4ac,0,d918f4ec) at netbsd:vrele+0x107
> vget(d918f4ec,10012,544,0,c1f33b00) at netbsd:vget+0x86
> ffs_sync(c1f35000,3,cb7e0ee0,cb7f5a80,ccb14e3c) at netbsd:ffs_sync+0xbc
> sync_fsync(cca45c08,46aba353,cca45c1c,c028f71b,cca45c10) at
> netbsd:sync_fsync+0x7b
> VOP_FSYNC(ccb14e3c,cb7e0ee0,8,0,0) at netbsd:VOP_FSYNC+0x47
> sched_sync(cb7f5a80,0,c01002ac,fbff,c01002ac) at netbsd:sched_sync+0xcf
> 
> Do anyone have any explanations ?

Could you try this patch (same as posted already earlier).

Thanks.

Index: kern/vfs_subr.c
===================================================================
RCS file: /cvsroot/src/sys/kern/vfs_subr.c,v
retrieving revision 1.291
diff -p -u -r1.291 vfs_subr.c
--- kern/vfs_subr.c	17 Jul 2007 21:14:05 -0000	1.291
+++ kern/vfs_subr.c	24 Jul 2007 11:08:17 -0000
@@ -1535,7 +1535,7 @@ vclean(struct vnode *vp, int flags, stru
 	 * We don't drain the lock because it might have been exported
 	 * to upper layers by this vnode and could still be in use.
 	 */
-	VOP_LOCK(vp, LK_EXCLUSIVE | LK_INTERLOCK);
+	VOP_LOCK(vp, LK_DRAIN | LK_RESURRECT | LK_INTERLOCK);
 
 	/*
 	 * Clean out any cached data associated with the vnode.
Index: kern/kern_lock.c
===================================================================
RCS file: /cvsroot/src/sys/kern/kern_lock.c,v
retrieving revision 1.116
diff -p -u -r1.116 kern_lock.c
--- kern/kern_lock.c	18 Jun 2007 21:37:32 -0000	1.116
+++ kern/kern_lock.c	24 Jul 2007 11:08:18 -0000
@@ -917,7 +917,9 @@ lockmgr(volatile struct lock *lkp, u_int
 		    RETURN_ADDRESS);
 		if (error)
 			break;
-		lkp->lk_flags |= LK_DRAINING | LK_HAVE_EXCL;
+		lkp->lk_flags |= LK_HAVE_EXCL;
+		if ((extflags & LK_RESURRECT) == 0)
+			lkp->lk_flags |= LK_DRAINING;
 		SETHOLDER(lkp, pid, lid, cpu_num);
 #if defined(LOCKDEBUG)
 		lkp->lk_lock_file = file;
Index: sys/lock.h
===================================================================
RCS file: /cvsroot/src/sys/sys/lock.h,v
retrieving revision 1.71
diff -p -u -r1.71 lock.h
--- sys/lock.h	17 May 2007 14:51:42 -0000	1.71
+++ sys/lock.h	24 Jul 2007 11:08:18 -0000
@@ -229,7 +229,7 @@ struct lock {
  * or passed in as arguments to the lock manager. The LK_REENABLE flag may be
  * set only at the release of a lock obtained by drain.
  */
-#define	LK_EXTFLG_MASK	0x00700070	/* mask of external flags */
+#define	LK_EXTFLG_MASK	0x00f00070	/* mask of external flags */
 #define	LK_NOWAIT	0x00000010	/* do not sleep to await lock */
 #define	LK_SLEEPFAIL	0x00000020	/* sleep, then return failure */
 #define	LK_CANRECURSE	0x00000040	/* this may be recursive lock attempt */
@@ -237,6 +237,7 @@ struct lock {
 #define	LK_SETRECURSE	0x00100000	/* other locks while we have it OK */
 #define	LK_RECURSEFAIL  0x00200000	/* attempt at recursive lock fails */
 #define	LK_SPIN		0x00400000	/* lock spins instead of sleeps */
+#define	LK_RESURRECT	0x00800000	/* immediately reenable drained lock */
 /*
  * Internal lock flags.
  *

-- 
Antti Kantee <pooka@iki.fi>                     Of course he runs NetBSD
http://www.iki.fi/pooka/                          http://www.NetBSD.org/
    "la qualité la plus indispensable du cuisinier est l'exactitude"