Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Jul 2004 16:38:34 -0400 (EDT)
From:      Robert Watson <rwatson@FreeBSD.org>
To:        John Baldwin <jhb@FreeBSD.org>
Cc:        current@FreeBSD.org
Subject:   Re: panic: Assertion td->td_turnstile != NULL failed at ../../../kern/subr_turnstile.c:478
Message-ID:  <Pine.NEB.3.96L.1040713163748.88111N-100000@fledge.watson.org>
In-Reply-To: <200407091537.33824.jhb@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, 9 Jul 2004, John Baldwin wrote:

> 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: 

FYI, I'm now using this tweak on my test kernels on the same box, and have
yet to trigger it (with or without PREEMPTION).  I'll keep hammering away,
but largely without PREEMPTION because reproducing the hang is turning out
not to be a problem :-).

Robert N M Watson             FreeBSD Core Team, TrustedBSD Projects
robert@fledge.watson.org      Principal Research Scientist, McAfee Research


> 
> 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@FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
> "Power Users Use the Power to Serve"  =  http://www.FreeBSD.org
> 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.NEB.3.96L.1040713163748.88111N-100000>