Messages in this thread | | | Subject | Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU | From | Steven Rostedt <> | Date | Tue, 17 Aug 2010 09:27:19 -0400 |
| |
On Mon, 2010-08-16 at 18:07 -0400, Mathieu Desnoyers wrote:
> > Moving this down past the check of t->rcu_read_lock_special (which is > > now covered by ACCESS_ONCE()) would violate the C standard, as it would > > be equivalent to moving a volatile up past a sequence point. > > Hrm, I'm not quite convinced yet. I am not concerned about gcc moving > the volatile access prior to the sequence point (as you say, this is > forbidden by the C standard), but rather that: > > --(t->rcu_read_lock_nesting) > > could be split in two distinct operations: > > read t->rcu_read_lock_nesting > decrement t->rcu_read_lock_nesting > > Note that in order to know the result required to pass the sequence > point "&&" (the test), we only need to perform the read, not the > decrement. AFAIU, gcc would be in its rights to move the > t->rcu_read_lock_nesting update after the volatile access. >
If we are this concerned, what about just doing:
--t->rcu_read_lock_nesting; if (ACCESS_ONCE(t->rcu_read_lock_nesting) == 0 && unlikely((ACCESS_ONCE(t->rcu_read_unlock_special)))
-- Steve
| |