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"