Re: panic: sleeping thread owns a non-sleepable lock

From: Max Laier <max_at_love2party.net>
Date: Wed, 15 Aug 2007 20:51:50 +0200
On Wednesday 15 August 2007, Rong-en Fan wrote:
> On 8/12/07, Max Laier <max_at_love2party.net> wrote:
> > On Saturday 11 August 2007, Kris Kennaway wrote:
> > > On Sun, Aug 12, 2007 at 02:22:35AM +0800, Rong-en Fan wrote:
> > > > I'm running 7.0-CURRENT as of  yesterday, and it's very easy
> > > > to make it panic:
> > > >
> > > > Sleeping thread (tid 100065, pid 1066) owns a non-sleepable lock
> > > > sched_switch(c50a1600,0,1,1c7a7e4,4217e5,...) at
> > > > sched_switch+0x190 mi_switch(1,0) at mi_switch+0x13f
> > > > sleepq_switch(c50a1600,0,c078a4e2,21b,c07e3820,...) at
> > > > sleepq_switch+0x87 sleepq_wait(c07e3820,0,c0770b7e,3,0,...) at
> > > > sleepq_wait+0x36 _sx_xlock_hard(c07e3820,c50a1600,0,0,0,...) at
> > > > _sx_xlock_hard+0x21d
> > > > fr_checknatout(f9c7a8d0,f9c7a8cc,64,c57ad900,c4de7400,...) at
> > > > fr_checknatout+0x29d
> > > > fr_check(c8cc4644,14,c4de7400,1,f9c7a9b4,...) at fr_check+0x9b1
> > > > fr_check_wrapper(0,f9c7a9b4,c4de7400,2,c54dab28,...) at
> > > > fr_check_wrapper+0x3f
> > > > pfil_run_hooks(c08057c0,f9c7aa4c,c4de7400,2,c54dab28,...) at
> > > > pfil_run_hooks+0x74 ip_output(c8cc4600,0,f9c7aa10,0,0,...) at
> > > > ip_output+0x913
> > > > tcp_output(cae322d0,cb277200,0,0,0,...) at tcp_output+0x1106
> > > > tcp_usr_send(c51e7318,0,cb277200,0,0,...) at tcp_usr_send+0x240
> > > > kern_sendfile(c50a1600,f9c7acfc,0,0,0,...) at
> > > > kern_sendfile+0x1037
> > > > sendfile(c50a1600,f9c7acfc,20,16,f9c7ad2c,...) at sendfile+0xa8
> > > > syscall(f9c7ad38) at syscall+0x315
> > > > Xint0x80_syscall() at Xint0x80_syscall+0x20
> > > > --- syscall (393, FreeBSD ELF32, sendfile), eip = 0x28290bff, esp
> > > > = 0xbfbfc6ac, ebp = 0xbfbfe718 ---
> > >
> > > What is the lock it holds, and where is it acquired?
> >
> > My bet is on the pfil rwlock - accquired in pfil_run_hooks and
> > tcbinfo / inp mtxs from tcp_output.  Nothing in the transmission path
> > must use sx locks.  I keep on telling that.
>
> I compiled kernel with WITNESS and INVARIANTS as in GENERIC.
> After boot, without doing anything (I even set ipnat_enable="NO", i.e.
> only ipfw is running, but ipf/ipnat is compiled in). I got panic.
> I don't have serial console attached, but the console screen is at
>
> http://www.rafan.org/tmp/pfil_panic.jpg
>
> You can find 'show locks', 'show allpcpu', and 'show lock' for each
> lock. Also two trace for thread that are found in 'show allpcpu'.
>
> If necessary, I can setup serial console, but it will take few days.

The problem is understood and has been reported to the ipfilter 
maintainer.  One sollution might be to use rwlocks instead, but if there 
is a path that sleeps with the lock held another sollution might be 
required.  Most likely the ioctl path (on copyin/copyout) exercises that 
problem.

-- 
/"\  Best regards,                      | mlaier_at_freebsd.org
\ /  Max Laier                          | ICQ #67774661
 X   http://pf4freebsd.love2party.net/  | mlaier_at_EFnet
/ \  ASCII Ribbon Campaign              | Against HTML Mail and News

Received on Wed Aug 15 2007 - 16:52:07 UTC

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