Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 16 Jun 2007 19:27:06 +0930
From:      Benjamin Close <Benjamin.Close@clearchain.com>
To:        Kris Kennaway <kris@obsecurity.org>
Cc:        freebsd-current@freebsd.org
Subject:   Re: Swapfile on ZFS & Deadlock
Message-ID:  <4673B3F2.3050006@clearchain.com>
In-Reply-To: <20070616034006.GA17514@rot13.obsecurity.org>
References:  <4672945C.3060304@clearchain.com> <20070615182521.GB9619@rot13.obsecurity.org> <46735745.5000401@clearchain.com> <20070616034006.GA17514@rot13.obsecurity.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Kris Kennaway wrote:
> On Sat, Jun 16, 2007 at 12:51:41PM +0930, Benjamin Close wrote:
>   
>> Kris Kennaway wrote:
>>     
>>> On Fri, Jun 15, 2007 at 11:00:04PM +0930, Benjamin Close wrote:
>>>  
>>>       
>>>> Hi All,
>>>>   Whilst running out of memory compiling Xorg (scanPCI is a killer) I 
>>>> discovered a quick way to deadlock the system:
>>>>
>>>> dd if=/dev/zero of=somefileonzfs bs=something count=something
>>>> mdconfig -a -f something
>>>> swapon /dev/md0
>>>>
>>>> Then do something that needs swap.. instant deadlock. The system is 
>>>> still responsive but all disk access become hung.
>>>>
>>>> Known issue? If so is there a way we can warn users/prevent users from 
>>>> doing it?
>>>>    
>>>>         
>>> Enable DEBUG_VFS_LOCKS and DEBUG_LOCKS, then break to DDB when the
>>> deadlock occurs and do 'show lockedvnods'.
>>>  
>>>       
>> Ok, enabled the above and this time got:
>>
>> swap_pager: indefinite wait buffer: bufobj: 0, blkno: 312865, size: 16384
>>
>> just before the deadlock:
>>
>> Show locked vnods returns (hand transcribed)
>>
>> 0xffffff002c3ab5d0: tagz zfs, type VREG
>>    usecout 1, writecount 1, refcount 2 mountedhere 0
>>    flags()
>>    v_object 0xffffff002f047c80 ref 0 pages 0
>>       lock type zfs: EXCL (count 1) by thread 0xffffff0030573360 (pid 1188)
>>     
>
> What was needed was the backtrace that should have been also displayed
> here.
>
>   
oops, made the kernel, forgot to install it, new trace below - looks 
like this one is not directly zil related.
>> Pid 1188 is:
>>
>> 1188   0   0   0   SL   zfs:(&zi   0xffffff000208fd58   [md0]
>>     
>
> Also a trace of the current backtrace of this.  However based on the
> single byte of information 'i' I predict that this is due to zil (ZFS
> intent logging).  I have turned this off on my machines because of
> deadlock conditions during low memory, which is also going to be true
> on your system.  Try adding to /boot/loader.conf
>
> vfs.zfs.zil_disable=1
>
>   
So this is a known issue then.
>> called doadump and though it went through the motions, savecore didn't 
>> find anything saved.
>> Not sure what you need debugging wise, let me know.
>>
>> System is Intel Core 2 duo, running in SMP amd64, updated Friday 15th June.
>> The box has 1G physical ram, 1G dedicated swap partition, but needs an 
>> extra 300M to compile xf86ScanPCI.c (freaky!).
>>     
>
> Or just use -O0 on this file.
>   
In the end I did use -O0 but figured the report would be more 
worthwhile, it's certainly a issue for when zfs becomes non experimental.
Here's the latest trace:

0xffffff0023daa20: tag zfs, type VREG
    usecount 1, writecount 1, refcount 2, mounted here0
    flags()
    vobject 0xffffff002df1cbb8  ref 0 pages 0  
    lock type zfs: EXCL (count 1) by thread 0xffffff002ed5b000 (pid 1033)
#0 0xfffffff8045f62b at _lockmgr+0x4cb
#1 at ... VOP_LOCK1_APV+0x79
#2 at ... _vn_lock+0x94
#3 at ...  mdstart_vnode+0x15f
#4 at ... md_kthread+0x111
#5 at ... fork_exit
#6 at ... fork_trampoline

1033   0   0   0   SL   vmwait   0xffffffff80a573b8 [md0]

Trace 1033
sched_switch()+0x15e
mi_switch+0x231
sleepq_switch+0xc7
sleepq_wait+0x44
_sleep+0x327
kmem_malloc+0x2a2
uma_large_malloc+0x4a
malloc+0x12d
arc_get_data_buf+0x36e
arc_buf_alloc+0xe4
arc_read+0fa
dbuf_read+0x43a
dmu_tx_check_ioerr+09a
dmu_tx_count_write+0x178
dmu_tx_hold_write+0x4a
zfs_freebsd_write+0x399
VOP_WRITE_APV+0xe5
mdstart_vnod()+0x1a5
md_kthread+0x111
fork_exit
fork_trampoline

Looks like zfs is wanting to write but in order to do it needs memory so 
asks md for it. md needs to page something out in order to be able to 
provide it. Since md is zfs file backed -  deadlock.
Got a dump this time but the stack appears corrupt .... hmm, haven't got 
a valid dump for a while now, wonder if something else is up.

mdstart_vnode+0x15f:

564   vn_lock(vp,KL_EXCLUSIVE | LK_RETY, td );


Cheers,
    Benjamin




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4673B3F2.3050006>