threads/89262: [kernel] [patch] multi-threaded process hangs
in kernel in fork()
David Xu
davidxu at freebsd.org
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 freebsd.org>
To: John Baldwin <jhb at freebsd.org>
Cc: bug-followup at freebsd.org, garry at networkphysics.com
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().
>>
>>http://people.freebsd.org/~davidxu/patch/slpq_susp4.patch
>>
>>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