Re: contemporary -current panic: locking against myself

From: Pawel Jakub Dawidek <pjd_at_FreeBSD.org>
Date: Fri, 3 Aug 2007 12:20:19 +0200
On Thu, Aug 02, 2007 at 03:58:26PM +0400, Dmitry Morozovsky wrote:
> 
> Hi there colleagues,
> 
> FreeBSD/i386 on Athlon X2, HEAD without WITNESS. 4G of RAM. tmpfs used for 
> 'make release'.
> 
> 
> panic: lockmgr: locking against myself
> cpuid = 0
> KDB: enter: panic
> [thread pid 19396 tid 100245 ]
> Stopped at      kdb_enter+0x32: leave
> 
> db> tr  
> Tracing pid 19396 tid 100245 td 0xce194220
> kdb_enter(c066f664,0,c066dca9,e92799cc,0,...) at kdb_enter+0x32
> panic(c066dca9,e92799dc,c0559cc7,e9279ac0,ca2f7770,...) at panic+0x124
> _lockmgr(ca2f77c8,3002,ca2f77f8,ce194220,c0675afc,...) at _lockmgr+0x401
> vop_stdlock(e9279a5c,ce194220,3002,ca2f7770,e9279a80,...) at vop_stdlock+0x40
> VOP_LOCK1_APV(d06417e0,e9279a5c,e9279bc0,0,c8d00330,...) at VOP_LOCK1_APV+0x46
> _vn_lock(ca2f7770,3002,ce194220,c0675afc,7f3,...) at _vn_lock+0x166
> vget(ca2f7770,1000,ce194220,0,e9279b98,...) at vget+0x114
> vm_object_reference(d1c70348,e9279b30,c063f81d,c0c71000,e381d000,...) at 
> vm_object_reference+0x12a
> kern_execve(ce194220,e9279c5c,0,28204548,282045d8,e381d000,e381d000,e381d015,e381d4dc,e385d000,3fb24,3,20) 
> at kern_execve+0x31a
> execve(ce194220,e9279cfc,c,ce194220,e9279d2c,...) at execve+0x4c
> syscall(e9279d38) at syscall+0x345
> Xint0x80_syscall() at Xint0x80_syscall+0x20
> --- syscall (59, FreeBSD ELF32, execve), eip = 0x28146a47, esp = 0xbfbfe4cc, 
> ebp = 0xbfbfe4e8 ---
> 
> db> show lockedvnods
> Locked vnodes
> 
> 0xca2f7770: tag tmpfs, type VREG
>     usecount 1, writecount 0, refcount 4 mountedhere 0
>     flags ()
>     v_object 0xd1c70348 ref 1 pages 19
>      lock type tmpfs: EXCL (count 1) by thread 0xce194220 (pid 19396) with 1 
> pending
> tag VT_TMPFS, tmpfs_node 0xd177f9d4, flags 0x0, links 9
>         mode 0555, owner 0, group 0, size 76648, status 0x0
> 
> It seems there is some locking problem in tmpfs.
> 
> What other info should I provide to help resolve the problem?

Here you can find two patches, which may or may not fix your problem.
The first one is actually only to improve debug.

This patch adds all vnode flags to the output, because I believe you
have VI_OWEINACT set, but not printed:

	http://people.freebsd.org/~pjd/patches/vfs_subr.c.4.patch

The problem here is that vm_object_reference() calls vget() without any
lock flag and vget() locks vnode exclusively when the VI_OWEINACT flag
is set. vget() should probably be fixed too, but jeff_at_ opinion is that
it shouldn't happen in this case, so this may be tmpfs bug.

The patch below fixes some locking problems in tmpfs:

	http://people.freebsd.org/~pjd/patches/tmpfs.patch

The problems are:
- tmpfs_root() should honour 'flags' argument, and not always lock the
  vnode exclusively,
- tmpfs_lookup() should lock vnode using cnp->cn_lkflags, and not always
  do it exclusively,
- in ".." case when we unlock directory vnode to avoid deadlock, we
  should relock it using the same type of lock it was locked before and
  not always relock it exclusively,

Note, that this patch wasn't even compiled tested.

-- 
Pawel Jakub Dawidek                       http://www.wheel.pl
pjd_at_FreeBSD.org                           http://www.FreeBSD.org
FreeBSD committer                         Am I Evil? Yes, I Am!

Received on Fri Aug 03 2007 - 08:21:29 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:15 UTC