Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 05 Jul 2001 12:37:47 -0700 (PDT)
From:      John Baldwin <jhb@FreeBSD.org>
To:        Alfred Perlstein <bright@sneakerz.org>
Cc:        Jake Burkholder <jake@FreeBSD.org>, cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org, Matt Dillon <dillon@earth.backplane.com>, Matthew Jacob <mjacob@feral.com>, Doug Rabson <dfr@nlsystems.com>
Subject:   Re: cvs commit: src/sys/sys systm.h condvar.h src/sys/kern kern_
Message-ID:  <XFMail.010705123747.jhb@FreeBSD.org>
In-Reply-To: <20010705131757.E929@sneakerz.org>

next in thread | previous in thread | raw e-mail | index | archive | help

On 05-Jul-01 Alfred Perlstein wrote:
> * Doug Rabson <dfr@nlsystems.com> [010705 11:56] wrote:
>> 
>> Right. I'm not actually arguing for the existence of mwakeup() and
>> friends.  I can't yet see any race window that they close when compared to
>> a code sequence which calls wakeup() followed by mtx_unlock().
> 
> It's not a race, it's just an optimization to avoid this happening.
> 
> Thread A locks a mutex,
> Thread A determines it must wait for an event on the object protected
> by the mutex and calls msleep(),
> Thread B locks the mutex,
> Thread B fiddles a structure and calls wakeup on it to signal
> waiting 'A' that it can proceed.
> 
> At this point there may be preemption, if Thread A now runs, it will
> immediately block on the mutex again because B hasn't released it.
> 
> This is avoided with mwakeup().
> 
> However, I'm not much of a fan of wakeup() being a premption point.

It happens with SMP, too, not just preemption.  The calls are an optimization
to avoid problems with releasing the lock after the wakeup.  The contention can
be avoided if we release the lock before calling wakeup(), but doing that
leaves a window open for another CPU to alter the data that the lock protects
possibly invalidating the wakeup that then gets sent.

These aren't preemption-only problems.  Preemption just simulates the SMP
environment (since another CPU can grab a process as soon as setrunqueue()
completes), so things that preemption bring up are going to occur in a
non-preemptive SMP kernel, as well.
 
> -Alfred

-- 

John Baldwin <jhb@FreeBSD.org> -- http://www.FreeBSD.org/~jhb/
PGP Key: http://www.baldwin.cx/~john/pgpkey.asc
"Power Users Use the Power to Serve!"  -  http://www.FreeBSD.org/

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message




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