|
@@ -184,12 +184,12 @@ static inline int rcu_read_lock_sched_held(void)
|
|
|
({ \
|
|
|
if (debug_locks) \
|
|
|
WARN_ON_ONCE(!(c)); \
|
|
|
- rcu_dereference(p); \
|
|
|
+ rcu_dereference_raw(p); \
|
|
|
})
|
|
|
|
|
|
#else /* #ifdef CONFIG_PROVE_RCU */
|
|
|
|
|
|
-#define rcu_dereference_check(p, c) rcu_dereference(p)
|
|
|
+#define rcu_dereference_check(p, c) rcu_dereference_raw(p)
|
|
|
|
|
|
#endif /* #else #ifdef CONFIG_PROVE_RCU */
|
|
|
|
|
@@ -325,21 +325,48 @@ static inline notrace void rcu_read_unlock_sched_notrace(void)
|
|
|
|
|
|
|
|
|
/**
|
|
|
- * rcu_dereference - fetch an RCU-protected pointer in an
|
|
|
- * RCU read-side critical section. This pointer may later
|
|
|
- * be safely dereferenced.
|
|
|
+ * rcu_dereference_raw - fetch an RCU-protected pointer
|
|
|
+ *
|
|
|
+ * The caller must be within some flavor of RCU read-side critical
|
|
|
+ * section, or must be otherwise preventing the pointer from changing,
|
|
|
+ * for example, by holding an appropriate lock. This pointer may later
|
|
|
+ * be safely dereferenced. It is the caller's responsibility to have
|
|
|
+ * done the right thing, as this primitive does no checking of any kind.
|
|
|
*
|
|
|
* Inserts memory barriers on architectures that require them
|
|
|
* (currently only the Alpha), and, more importantly, documents
|
|
|
* exactly which pointers are protected by RCU.
|
|
|
*/
|
|
|
-
|
|
|
-#define rcu_dereference(p) ({ \
|
|
|
+#define rcu_dereference_raw(p) ({ \
|
|
|
typeof(p) _________p1 = ACCESS_ONCE(p); \
|
|
|
smp_read_barrier_depends(); \
|
|
|
(_________p1); \
|
|
|
})
|
|
|
|
|
|
+/**
|
|
|
+ * rcu_dereference - fetch an RCU-protected pointer, checking for RCU
|
|
|
+ *
|
|
|
+ * Makes rcu_dereference_check() do the dirty work.
|
|
|
+ */
|
|
|
+#define rcu_dereference(p) \
|
|
|
+ rcu_dereference_check(p, rcu_read_lock_held())
|
|
|
+
|
|
|
+/**
|
|
|
+ * rcu_dereference_bh - fetch an RCU-protected pointer, checking for RCU-bh
|
|
|
+ *
|
|
|
+ * Makes rcu_dereference_check() do the dirty work.
|
|
|
+ */
|
|
|
+#define rcu_dereference_bh(p) \
|
|
|
+ rcu_dereference_check(p, rcu_read_lock_bh_held())
|
|
|
+
|
|
|
+/**
|
|
|
+ * rcu_dereference_sched - fetch RCU-protected pointer, checking for RCU-sched
|
|
|
+ *
|
|
|
+ * Makes rcu_dereference_check() do the dirty work.
|
|
|
+ */
|
|
|
+#define rcu_dereference_sched(p) \
|
|
|
+ rcu_dereference_check(p, rcu_read_lock_sched_held())
|
|
|
+
|
|
|
/**
|
|
|
* rcu_assign_pointer - assign (publicize) a pointer to a newly
|
|
|
* initialized structure that will be dereferenced by RCU read-side
|