All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: linux-kernel@vger.kernel.org
Cc: mingo@kernel.org, laijs@cn.fujitsu.com, dipankar@in.ibm.com,
	akpm@linux-foundation.org, mathieu.desnoyers@efficios.com,
	josh@joshtriplett.org, niv@us.ibm.com, tglx@linutronix.de,
	peterz@infradead.org, rostedt@goodmis.org, dhowells@redhat.com,
	edumazet@google.com, darren@dvhart.com, fweisbec@gmail.com,
	oleg@redhat.com, sbw@mit.edu,
	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Subject: [PATCH tip/core/rcu 06/12] rcu: Define rcu_assign_pointer() in terms of smp_store_release()
Date: Mon, 17 Feb 2014 13:35:53 -0800	[thread overview]
Message-ID: <1392672959-6386-6-git-send-email-paulmck@linux.vnet.ibm.com> (raw)
In-Reply-To: <1392672959-6386-1-git-send-email-paulmck@linux.vnet.ibm.com>

From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>

The new smp_store_release() function provides better guarantees than did
rcu_assign_pointer(), and potentially less overhead on some architectures.
The guarantee that smp_store_release() provides that rcu_assign_pointer()
does that is obscure, but its lack could cause considerable confusion.
This guarantee is illustrated by the following code fragment:

	struct foo {
		int a;
		int b;
		int c;
		struct foo *next;
	};
	struct foo foo1;
	struct foo foo2;
	struct foo __rcu *foop;

	...

	foo2.a = 1;
	foo2.b = 2;
	BUG_ON(foo2.c);
	rcu_assign_pointer(foop, &foo);

	...

	fp = rcu_dereference(foop);
	fp.c = 3;

The current rcu_assign_pointer() semantics permit the BUG_ON() to
trigger because rcu_assign_pointer()'s smp_wmb() is not guaranteed to
order prior reads against later writes.  This commit therefore upgrades
rcu_assign_pointer() from smp_wmb() to smp_store_release() to avoid this
counter-intuitive outcome.

Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
---
 include/linux/rcupdate.h | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
index 278a9da69ec4..32decf1a9c6c 100644
--- a/include/linux/rcupdate.h
+++ b/include/linux/rcupdate.h
@@ -44,6 +44,7 @@
 #include <linux/debugobjects.h>
 #include <linux/bug.h>
 #include <linux/compiler.h>
+#include <asm/barrier.h>
 
 #ifdef CONFIG_RCU_TORTURE_TEST
 extern int rcutorture_runnable; /* for sysctl */
@@ -580,12 +581,7 @@ static inline void rcu_preempt_sleep_check(void)
  * please be careful when making changes to rcu_assign_pointer() and the
  * other macros that it invokes.
  */
-#define rcu_assign_pointer(p, v) \
-	do { \
-		smp_wmb(); \
-		ACCESS_ONCE(p) = RCU_INITIALIZER(v); \
-	} while (0)
-
+#define rcu_assign_pointer(p, v) smp_store_release(&p, RCU_INITIALIZER(v))
 
 /**
  * rcu_access_pointer() - fetch RCU pointer with no dereferencing
-- 
1.8.1.5


  parent reply	other threads:[~2014-02-17 21:36 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-17 21:35 [PATCH tip/core/rcu 0/12] Miscellaneous fixes for 3.15 Paul E. McKenney
2014-02-17 21:35 ` [PATCH tip/core/rcu 01/12] rcu: Add ACCESS_ONCE() to ->n_force_qs_lh accesses Paul E. McKenney
2014-02-17 21:35   ` [PATCH tip/core/rcu 02/12] rcu: Stop tracking FSF's postal address Paul E. McKenney
2014-02-17 21:35   ` [PATCH tip/core/rcu 03/12] rcu: Remove ACCESS_ONCE() from jiffies Paul E. McKenney
2014-02-17 21:35   ` [PATCH tip/core/rcu 04/12] rcu: Glue ASCII strings together Paul E. McKenney
2014-02-17 21:35   ` [PATCH tip/core/rcu 05/12] rcu: Indentation and spacing fixes Paul E. McKenney
2014-02-17 21:35   ` Paul E. McKenney [this message]
2014-02-17 21:35   ` [PATCH tip/core/rcu 07/12] rcu: Disambiguate CONFIG_RCU_NOCB_CPUs Paul E. McKenney
2014-02-17 21:35   ` [PATCH tip/core/rcu 08/12] rcu: Move SRCU grace period work to power efficient workqueue Paul E. McKenney
2014-02-17 21:35   ` [PATCH tip/core/rcu 09/12] fs: Substitute rcu_access_pointer() for rcu_dereference_raw() Paul E. McKenney
2014-02-17 22:00     ` Josh Triplett
2014-02-17 23:05       ` Paul E. McKenney
2014-02-18  0:04         ` Josh Triplett
2014-02-18  0:27           ` Paul E. McKenney
2014-02-17 21:35   ` [PATCH tip/core/rcu 10/12] block: " Paul E. McKenney
2014-02-18 20:21     ` Jens Axboe
2014-02-17 21:35   ` [PATCH tip/core/rcu 11/12] notifier: " Paul E. McKenney
2014-02-17 21:35   ` [PATCH tip/core/rcu 12/12] rcu: Fix sparse warning for rcu_expedited from kernel/ksysfs.c Paul E. McKenney
2014-02-17 22:01 ` [PATCH tip/core/rcu 0/12] Miscellaneous fixes for 3.15 Josh Triplett

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=1392672959-6386-6-git-send-email-paulmck@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=darren@dvhart.com \
    --cc=dhowells@redhat.com \
    --cc=dipankar@in.ibm.com \
    --cc=edumazet@google.com \
    --cc=fweisbec@gmail.com \
    --cc=josh@joshtriplett.org \
    --cc=laijs@cn.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mathieu.desnoyers@efficios.com \
    --cc=mingo@kernel.org \
    --cc=niv@us.ibm.com \
    --cc=oleg@redhat.com \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=sbw@mit.edu \
    --cc=tglx@linutronix.de \
    /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.