td->td_critnest manipulations do not use atomic_add_int ?

John Baldwin jhb at freebsd.org
Tue Dec 20 10:30:20 PST 2005


On Tuesday 20 December 2005 11:16 am, Luigi Rizzo wrote:
> On Tue, Dec 20, 2005 at 06:34:20AM -0800, Suleiman Souhlal wrote:
> > Hello Luigi,
> >
> > Luigi Rizzo wrote:
> > > as in the subject... i see that td->td_critnest (used to determine
> > > whether a thread can be preempted or not) is manipulated using
> > > plain ++ or -- instruction instead of the atomic_add_int().
> >
> > This should be fine as it only gets modified by the current thread. If
> > an interrupt comes while we are decreasing td_critnest back to 0, then
> > we just don't get preempted immediately, but at the end of our quantum,
> > or when someone else tries to preempt us, whichever comes first, which
> > should be totally harmless.
>
> i think that there are still some potential race conditions if
> the variable is read from another processor to make a decision
> based on its value.

It's not, that's the key.  It's only read by the current thread.  Because of 
sched_lock being held when a thread context switches (and thus anytime it 
migrates) and the membars it contains, no other locking is needed for data 
that only curthread accesses.

-- 
John Baldwin <jhb at FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve"  =  http://www.FreeBSD.org


More information about the freebsd-current mailing list