Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 7 Jul 2010 14:14:42 +0200
From:      =?UTF-8?Q?Marius_N=C3=BCnnerich?= <marius@nuenneri.ch>
To:        Attilio Rao <attilio@freebsd.org>
Cc:        freebsd-current@freebsd.org, Bryan Venteicher <bryanv@daemoninthecloset.org>
Subject:   Re: deadlkres() panic
Message-ID:  <AANLkTilx5SZ8esR8CfF2Z8ulyRtQA8KEPtZQKZR1ZbN5@mail.gmail.com>
In-Reply-To: <AANLkTikPaLtElkaNzZ248xHhLUnF758rLPNL0YBdSv76@mail.gmail.com>
References:  <744734406.21.1277969273426.JavaMail.root@sage.daemoninthecloset.org> <269478215.24.1277969553870.JavaMail.root@sage.daemoninthecloset.org>  <AANLkTikPaLtElkaNzZ248xHhLUnF758rLPNL0YBdSv76@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Jul 7, 2010 at 14:01, Attilio Rao <attilio@freebsd.org> wrote:
> 2010/7/1 Bryan Venteicher <bryanv@daemoninthecloset.org>:
>> On a recent -current, I got the following panic from deadlkres:
>>
>> Assertion wchan != NULL failed at /usr/src-nfs/sys/kern/subr_sleepqueue.c:680
>>
>> Tracing pid 0 tid 100058 td 0xffffff00024bf7a0
>> kdb_enter() at kdb_enter+0x3d
>> panic() at panic+0x176
>> sleepq_type() at sleepq_type+0x56
>> deadlkres() at deadlkres+0x224
>> fork_exit() at fork_exit+0x12a
>> fork_trampoline() at fork_trampoline+0xe
>> --- trap 0, rip = 0, rsp = 0xffffff8074976d30, rbp = 0 ---
>> (Hand transcribed, doadump() hung)
>>
>> deadlkres() came across a TD_IS_SLEEPING()'ing thread that was not a
>> sleepqueue (ie, td->td_wchan == NULL).
>>
>> I don't think this is an invalid state for thread to be in: After adding itself
>> to a sleepq and setting a timeout, the thread calls sleepq_timedwait_sig().
>> sleepq_catch_signals() determines there is a signal pending so it removes the
>> thread from the sleepq via sleepq_resume_thread(). Returning to
>> sleepq_timedwait_sig(), in the call to sleepq_check_timeout(), the thread is
>> unable to cancel the timeout because it is already firing (likely waiting on
>> thread_lock()). So the thread calls TD_SET_SLEEPING() followed by mi_switch().
>> deadlkres() then picks up thread_lock(), finding td is TD_IS_SLEEPING() &&
>> !TD_ON_SLEEPQ().
>>
>> The attached patch takes care of the panic for me.
>
> I think that your analysis and patch are both fine and are committed,
> along with a small cleanup, as r209761.

Thank you both, I guess a had that panic a few days ago. Updating right now.



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