|
@@ -337,12 +337,14 @@ static void rcu_momentary_dyntick_idle(void)
|
|
|
*/
|
|
|
void rcu_note_context_switch(void)
|
|
|
{
|
|
|
+ barrier(); /* Avoid RCU read-side critical sections leaking down. */
|
|
|
trace_rcu_utilization(TPS("Start context switch"));
|
|
|
rcu_sched_qs();
|
|
|
rcu_preempt_note_context_switch();
|
|
|
if (unlikely(raw_cpu_read(rcu_sched_qs_mask)))
|
|
|
rcu_momentary_dyntick_idle();
|
|
|
trace_rcu_utilization(TPS("End context switch"));
|
|
|
+ barrier(); /* Avoid RCU read-side critical sections leaking up. */
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(rcu_note_context_switch);
|
|
|
|
|
@@ -353,12 +355,19 @@ EXPORT_SYMBOL_GPL(rcu_note_context_switch);
|
|
|
* RCU flavors in desperate need of a quiescent state, which will normally
|
|
|
* be none of them). Either way, do a lightweight quiescent state for
|
|
|
* all RCU flavors.
|
|
|
+ *
|
|
|
+ * The barrier() calls are redundant in the common case when this is
|
|
|
+ * called externally, but just in case this is called from within this
|
|
|
+ * file.
|
|
|
+ *
|
|
|
*/
|
|
|
void rcu_all_qs(void)
|
|
|
{
|
|
|
+ barrier(); /* Avoid RCU read-side critical sections leaking down. */
|
|
|
if (unlikely(raw_cpu_read(rcu_sched_qs_mask)))
|
|
|
rcu_momentary_dyntick_idle();
|
|
|
this_cpu_inc(rcu_qs_ctr);
|
|
|
+ barrier(); /* Avoid RCU read-side critical sections leaking up. */
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(rcu_all_qs);
|
|
|
|