Re: panic: Assertion td->td_turnstile != NULL failed at ../../../kern/subr_turnstile.c:478

From: John Baldwin <jhb_at_FreeBSD.org>
Date: Fri, 9 Jul 2004 15:37:33 -0400
On Friday 09 July 2004 01:54 pm, Robert Watson wrote:
> On Fri, 9 Jul 2004, John Baldwin wrote:
> > > login: root
> > > Password:panic: Assertion td->td_turnstile != NULL failed at
> > > ../../../kern/subr_turnstile.c:478
> >
> > This means your thread has no turnstile to give to the lock it is
> > blocking on.  Are you using TURNSTILE_PROFILING on this box?
>
> Not currently.  Would you like me to?

No, I was curious if there was a bug in the _PROFILING case. :)  Actually, 
hmm.  Looks like we don't setrunqueue() until after giving the thread a 
turnstile.  Can you see if this assertion is triggered:

Index: subr_turnstile.c
===================================================================
RCS file: /usr/cvs/src/sys/kern/subr_turnstile.c,v
retrieving revision 1.145
diff -u -r1.145 subr_turnstile.c
--- subr_turnstile.c    2 Jul 2004 19:09:49 -0000       1.145
+++ subr_turnstile.c    9 Jul 2004 19:35:27 -0000
_at__at_ -736,6 +736,7 _at__at_
                        td->td_lockname = NULL;
                        TD_CLR_LOCK(td);
                        MPASS(TD_CAN_RUN(td));
+                       MPASS(td->td_turnstile != NULL);
                        setrunqueue(td);
                } else {
                        td->td_flags |= TDF_TSNOBLOCK;

Also, you can try wrapping the entire while() loop there in turnstile_unpend() 
in a critical secton to force it to wake up all the threads before 
preempting.  Also, are you using MUTEX_WAKE_ALL by chance?

-- 
John Baldwin <jhb_at_FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve"  =  http://www.FreeBSD.org
Received on Fri Jul 09 2004 - 17:36:24 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:01 UTC