From: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
linux-kernel@vger.kernel.org, mingo@elte.hu,
laijs@cn.fujitsu.com, dipankar@in.ibm.com,
akpm@linux-foundation.org, josh@joshtriplett.org,
dvhltc@us.ibm.com, niv@us.ibm.com, tglx@linutronix.de,
peterz@infradead.org, Valdis.Kletnieks@vt.edu,
dhowells@redhat.com, eric.dumazet@gmail.com,
Linus Torvalds <torvalds@linux-foundation.org>
Subject: Re: [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU
Date: Tue, 17 Aug 2010 10:16:38 -0400 [thread overview]
Message-ID: <20100817141638.GA5722@Krystal> (raw)
In-Reply-To: <1282051639.3268.1335.camel@gandalf.stny.rr.com>
* Steven Rostedt (rostedt@goodmis.org) wrote:
> 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)))
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
>
> -- Steve
>
>
--
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com
next prev parent reply other threads:[~2010-08-17 14:16 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-09 22:14 [PATCH tip/core/rcu 0/N] Additional RCU commits queued for 2.6.37 Paul E. McKenney
2010-08-09 22:15 ` [PATCH tip/core/rcu 01/10] rcu head remove init Paul E. McKenney
2010-08-09 22:15 ` [PATCH tip/core/rcu 02/10] Update documentation to note the passage of INIT_RCU_HEAD() Paul E. McKenney
2010-08-09 22:15 ` [PATCH tip/core/rcu 03/10] Update call_rcu() usage, add synchronize_rcu() Paul E. McKenney
2010-08-09 22:15 ` [PATCH tip/core/rcu 04/10] rcu: allow RCU CPU stall warning messages to be controlled in /sys Paul E. McKenney
2010-08-09 22:15 ` [PATCH tip/core/rcu 05/10] rcu: restrict TREE_RCU to SMP builds with !PREEMPT Paul E. McKenney
2010-08-09 22:15 ` [PATCH tip/core/rcu 06/10] rcu: Allow RCU CPU stall warnings to be off at boot, but manually enablable Paul E. McKenney
2010-08-09 22:15 ` [PATCH tip/core/rcu 07/10] rcu: Fix RCU_FANOUT help message Paul E. McKenney
2010-08-09 22:15 ` [PATCH tip/core/rcu 08/10] rcu: Add a TINY_PREEMPT_RCU Paul E. McKenney
2010-08-16 15:07 ` Mathieu Desnoyers
2010-08-16 18:33 ` Paul E. McKenney
2010-08-16 19:19 ` Mathieu Desnoyers
2010-08-16 21:32 ` Paul E. McKenney
2010-08-16 21:41 ` Mathieu Desnoyers
2010-08-16 21:55 ` Paul E. McKenney
2010-08-16 22:07 ` Mathieu Desnoyers
2010-08-16 22:24 ` Paul E. McKenney
2010-08-17 9:36 ` Lai Jiangshan
2010-08-17 14:35 ` Paul E. McKenney
2010-08-17 13:27 ` Steven Rostedt
2010-08-17 14:16 ` Mathieu Desnoyers [this message]
2010-08-17 14:54 ` Steven Rostedt
2010-08-17 15:55 ` Mathieu Desnoyers
2010-08-17 16:04 ` Steven Rostedt
2010-08-17 16:06 ` Steven Rostedt
2010-08-17 16:25 ` Mathieu Desnoyers
2010-08-17 19:33 ` Paul E. McKenney
2010-08-17 20:00 ` Paul E. McKenney
2010-08-09 22:15 ` [PATCH tip/core/rcu 09/10] rcu: update obsolete rcu_read_lock() comment Paul E. McKenney
2010-08-16 14:45 ` Mathieu Desnoyers
2010-08-16 17:55 ` Paul E. McKenney
2010-08-16 18:24 ` Mathieu Desnoyers
2010-08-09 22:15 ` [PATCH tip/core/rcu 10/10] rcu: refer RCU CPU stall-warning victims to stallwarn.txt Paul E. McKenney
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100817141638.GA5722@Krystal \
--to=mathieu.desnoyers@polymtl.ca \
--cc=Valdis.Kletnieks@vt.edu \
--cc=akpm@linux-foundation.org \
--cc=dhowells@redhat.com \
--cc=dipankar@in.ibm.com \
--cc=dvhltc@us.ibm.com \
--cc=eric.dumazet@gmail.com \
--cc=josh@joshtriplett.org \
--cc=laijs@cn.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=niv@us.ibm.com \
--cc=paulmck@linux.vnet.ibm.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.