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

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Mathieu Desnoyers
Date: Tuesday, August 17, 2010 - 7:16 am

* Steven Rostedt (rostedt@goodmis.org) wrote:

I'd be concerned by the fact that there is no strong ordering guarantee
that the non-volatile --t->rcu_read_lock_nesting is done before
ACCESS_ONCE(t->rcu_read_unlock_special).

My concern is that the compiler might be allowed to turn your code into:

        if (ACCESS_ONCE(t->rcu_read_lock_nesting) == 1 &&
             unlikely((ACCESS_ONCE(t->rcu_read_unlock_special))) {
 		--t->rcu_read_lock_nesting;
		do_something();
	} else
	 	--t->rcu_read_lock_nesting;

So whether or not this could be done by the compiler depending on the
various definitions of volatile, I strongly recommend against using
volatile accesses to provide compiler ordering guarantees. It is bad in
terms of code documentation (we don't document _what_ is ordered) and it
is also bad because the volatile ordering guarantees seems to be
very easy to misinterpret.

ACCESS_ONCE() should be only that: a macro that tells the access should
be performed only once. Why are we suddenly presuming it should have any
ordering semantic ?

It should be totally valid to create arch-specific ACCESS_ONCE() macros
that only perform the "read once", without the ordering guarantees
provided by the current ACCESS_ONCE() "volatile" implementation. The
following code is only for unsigned long, but you get the idea: there is
no volatile at all, and I ensure that "val" is only read once by using
the "+m" (val) constraint, telling the compiler (falsely) that the
assembler is modifying the value (it therefore has a side-effect), so
gcc won't be tempted to re-issue the assembly statement.

static inline unsigned long arch_access_once(unsigned long val)
{
	unsigned long ret;

#if (__BITS_PER_LONG == 32)
	asm ("movl %1,%0": "=r" (ret), "+m" (val));
#else
	asm ("movq %1,%0": "=r" (ret), "+m" (val));
#endif
}

Thanks,

Mathieu


-- 
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH tip/core/rcu 01/10] rcu head remove init, Paul E. McKenney, (Mon Aug 9, 3:15 pm)
[PATCH tip/core/rcu 07/10] rcu: Fix RCU_FANOUT help message, Paul E. McKenney, (Mon Aug 9, 3:15 pm)
[PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU, Paul E. McKenney, (Mon Aug 9, 3:15 pm)
Re: [PATCH tip/core/rcu 09/10] rcu: update obsolete rcu_re ..., Mathieu Desnoyers, (Mon Aug 16, 7:45 am)
Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU, Mathieu Desnoyers, (Mon Aug 16, 8:07 am)
Re: [PATCH tip/core/rcu 09/10] rcu: update obsolete rcu_re ..., Paul E. McKenney, (Mon Aug 16, 10:55 am)
Re: [PATCH tip/core/rcu 09/10] rcu: update obsolete rcu_re ..., Mathieu Desnoyers, (Mon Aug 16, 11:24 am)
Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU, Paul E. McKenney, (Mon Aug 16, 11:33 am)
Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU, Mathieu Desnoyers, (Mon Aug 16, 12:19 pm)
Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU, Paul E. McKenney, (Mon Aug 16, 2:32 pm)
Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU, Mathieu Desnoyers, (Mon Aug 16, 2:41 pm)
Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU, Paul E. McKenney, (Mon Aug 16, 2:55 pm)
Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU, Mathieu Desnoyers, (Mon Aug 16, 3:07 pm)
Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU, Paul E. McKenney, (Mon Aug 16, 3:24 pm)
Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU, Steven Rostedt, (Tue Aug 17, 6:27 am)
Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU, Mathieu Desnoyers, (Tue Aug 17, 7:16 am)
Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU, Paul E. McKenney, (Tue Aug 17, 7:35 am)
Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU, Steven Rostedt, (Tue Aug 17, 7:54 am)
Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU, Mathieu Desnoyers, (Tue Aug 17, 8:55 am)
Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU, Steven Rostedt, (Tue Aug 17, 9:04 am)
Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU, Steven Rostedt, (Tue Aug 17, 9:06 am)
Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU, Mathieu Desnoyers, (Tue Aug 17, 9:25 am)
Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU, Paul E. McKenney, (Tue Aug 17, 12:33 pm)
Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU, Paul E. McKenney, (Tue Aug 17, 1:00 pm)