rcu: Provide counterpart to rcu_dereference() for non-RCU situations
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Tue, 28 Oct 2014 04:11:27 +0000 (21:11 -0700)
committerJiri Slaby <jslaby@suse.cz>
Tue, 25 Aug 2015 14:56:59 +0000 (16:56 +0200)
commit 54ef6df3f3f1353d99c80c437259d317b2cd1cbd upstream.

Although rcu_dereference() and friends can be used in situations where
object lifetimes are being managed by something other than RCU, the
resulting sparse and lockdep-RCU noise can be annoying.  This commit
therefore supplies a lockless_dereference(), which provides the
protection for dereferences without the RCU-related debugging noise.

Reported-by: Al Viro <viro@ZenIV.linux.org.uk>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
include/linux/rcupdate.h

index f1f1bc39346b85c303c227e3137b78e0e87bdcc8..4912c953cab75293d04b2d779d6d5cd8076a8f54 100644 (file)
@@ -554,6 +554,20 @@ static inline void rcu_preempt_sleep_check(void)
                (p) = (typeof(*v) __force space *)(v); \
        } while (0)
 
+/**
+ * lockless_dereference() - safely load a pointer for later dereference
+ * @p: The pointer to load
+ *
+ * Similar to rcu_dereference(), but for situations where the pointed-to
+ * object's lifetime is managed by something other than RCU.  That
+ * "something other" might be reference counting or simple immortality.
+ */
+#define lockless_dereference(p) \
+({ \
+       typeof(p) _________p1 = ACCESS_ONCE(p); \
+       smp_read_barrier_depends(); /* Dependency order vs. p above. */ \
+       (_________p1); \
+})
 
 /**
  * rcu_access_pointer() - fetch RCU pointer with no dereferencing