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

John Baldwin jhb at FreeBSD.org
Fri Jul 9 12:36:24 PDT 2004


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
@@ -736,6 +736,7 @@
                        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


More information about the freebsd-current mailing list