cvs commit: src/sys/kern subr_sleepqueue.c
jhb at freebsd.org
Fri Jan 25 06:39:27 PST 2008
On Thursday 24 January 2008 09:09:38 pm John Baldwin wrote:
> jhb 2008-01-25 02:09:38 UTC
> FreeBSD src repository
> Modified files:
> sys/kern subr_sleepqueue.c
> Fix a race in the sleepqueue timeout code that resulted in sleeps not
> being properly cancelled by a timeout. In general there is a race
> between a the sleepq timeout handler firing while the thread is still
> in the process of going to sleep. In 6.x with sched_lock, the race was
> largely protected by sched_lock. The only place it was "exposed" and had
> to be handled was while checking for any pending signals in
> With the thread lock changes, the thread lock is dropped in between
> sleepq_add() and sleepq_*wait*() opening up a new window for this race.
> Thus, if the timeout fired while the sleeping thread was in between
> sleepq_add() and sleepq_*wait*(), the thread would be marked as timed
> out, but the thread would not be dequeued and sleepq_switch() would
> still block the thread until it was awakened via some other means. In
> the case of pause(9) where there is no other wakeup, the thread would
> never be awakened.
> Fix this by teaching sleepq_switch() to check if the thread has had its
> sleep canceled before blocking by checking the TDF_TIMEOUT flag and
> aborting the sleep and dequeueing the thread if it is set.
> MFC after: 3 days
> Reported by: dwhite, peter
This should fix the "vmo_de" hangs some people have reported on 7.x+.
More information about the cvs-src