Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 25 Jan 2008 07:39:41 -0500
From:      John Baldwin <jhb@freebsd.org>
To:        src-committers@freebsd.org
Cc:        cvs-src@freebsd.org, cvs-all@freebsd.org
Subject:   Re: cvs commit: src/sys/kern subr_sleepqueue.c
Message-ID:  <200801250739.41413.jhb@freebsd.org>
In-Reply-To: <200801250209.m0P29cjL050767@repoman.freebsd.org>
References:  <200801250209.m0P29cjL050767@repoman.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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 
>   Log:
>   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
>   sleepq_catch_signals().
>   
>   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+.

-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200801250739.41413.jhb>