Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU

From: Steven Rostedt
Date: Tue Aug 17 2010 - 09:27:28 EST


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


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/