threads/89262: [kernel] [patch] multi-threaded process hangs in kernel in fork()

David Xu davidxu at
Mon Feb 13 18:30:19 PST 2006

The following reply was made to PR threads/89262; it has been noted by GNATS.

From: David Xu <davidxu at>
To: John Baldwin <jhb at>
Cc: bug-followup at, garry at
Subject: Re: threads/89262: [kernel] [patch] multi-threaded process hangs
 in kernel in fork()
Date: Tue, 14 Feb 2006 10:23:14 +0800

 John Baldwin wrote:
 > On Monday 13 February 2006 04:11, David Xu wrote:
 >>ast will call userret which in turn will call thread_suspend_check.
 >>so the bug may not be here, but in other code.
 >>I have found a race between sleep queue and thread suspension code,
 >>the following patch fixed the bug, it also simplified interaction
 >>between sleep queue and signal code. now, sleepq_abort() is also
 >>fixed, it can save an errno, unlike current code, it wrongly works
 >>as wakeup().
 >>David Xu
 > Only thing I would prefer is that you keep sleepq_catch_signals() but make it 
 > an internal function that sleepq_waitsig() and sleepq_timed_waitsig() call 
 > before sleepq_switch() so that sleepq_switch() doesn't get so long. 
 The main reason I have inlined sleepq_catch_signals into sleepq_switch
 is proc and scheduler lock, I have to lock scheduler lock before 
 releasing proc lock. if I leave sleepq_catch_signals there,  other
 places have to lock scheduler lock before calling sleepq_switch.
 > Also, it 
 > would be good.  Also, in sleepq_switch() you are using sleepq_release() and 
 > sleepq_lock() even though you already have a sleepqueue_chain pointer, and 
 > you do mtx operations on sc->sc_lock explicitly in some other places.  It 
 > would be best to consistently just do mutex ops on sc->sc_lock instead of 
 > redoing the hash-lookup several times.
 Yes, this can be improved.
 David Xu

More information about the freebsd-threads mailing list