cvs commit: src/sys/kern subr_taskqueue.c

Scott Long scottl at samsco.org
Wed Jan 11 05:56:48 PST 2006


John Baldwin wrote:
> On Tuesday 10 January 2006 07:37 pm, Scott Long wrote:
> 
>>scottl      2006-01-11 00:37:13 UTC
>>
>>  FreeBSD src repository
>>
>>  Modified files:
>>    sys/kern             subr_taskqueue.c
>>  Log:
>>  The interlock in taskqueue_terminate() is completely wrong for taskqueues
>>  that use spinlocks.  Remove it for now.
> 
> 
> Eh?  It's waiting for the wakeup that comes from kthread_exit() after the 
> thread has exited which is locked via the proc lock.  Sleeping on the 
> taskqueue itself doesn't buy you anything.  (In fact, it might sleep 
> forever.)   The simplest solution might be to acquire the proc lock a lot 
> earlier before the taskqueue lock in this function so that you don't have to 
> acquire it while holding the taskqueue lock since that is what gives you 
> problems.
> 

With the code the way it was, kthread_exit() in taskqueue_thread_loop 
can wind up blocking on the proc lock while the lock is still held in
taskqueue_terminate.  I don't know why this is actually a problem, but
turning on WITNESS to investigate revealed the immediate problem of
trying to grab the proc lock with a spinlock already held.  The 
interlock is really just a protection against drivers that don't
adequately quiesce themselves, so I removed it for now until we can
figure out something better.

Scott


More information about the cvs-all mailing list