Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 80dcf60e authored by Paul E. McKenney's avatar Paul E. McKenney
Browse files

rcu: apply TINY_PREEMPT_RCU read-side speedup to TREE_PREEMPT_RCU



Replace one of the ACCESS_ONCE() calls in each of __rcu_read_lock()
and __rcu_read_unlock() with barrier() as suggested by Steve Rostedt in
order to avoid the potential compiler-optimization-induced bug noted by
Mathieu Desnoyers.

Located-by: default avatarMathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Suggested-by: default avatarSteven Rostedt <rostedt@goodmis.org>
Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
parent 7b0b759b
Loading
Loading
Loading
Loading
+4 −2
Original line number Original line Diff line number Diff line
@@ -201,7 +201,7 @@ static void rcu_preempt_note_context_switch(int cpu)
 */
 */
void __rcu_read_lock(void)
void __rcu_read_lock(void)
{
{
	ACCESS_ONCE(current->rcu_read_lock_nesting)++;
	current->rcu_read_lock_nesting++;
	barrier();  /* needed if we ever invoke rcu_read_lock in rcutree.c */
	barrier();  /* needed if we ever invoke rcu_read_lock in rcutree.c */
}
}
EXPORT_SYMBOL_GPL(__rcu_read_lock);
EXPORT_SYMBOL_GPL(__rcu_read_lock);
@@ -344,7 +344,9 @@ void __rcu_read_unlock(void)
	struct task_struct *t = current;
	struct task_struct *t = current;


	barrier();  /* needed if we ever invoke rcu_read_unlock in rcutree.c */
	barrier();  /* needed if we ever invoke rcu_read_unlock in rcutree.c */
	if (--ACCESS_ONCE(t->rcu_read_lock_nesting) == 0 &&
	--t->rcu_read_lock_nesting;
	barrier();  /* decrement before load of ->rcu_read_unlock_special */
	if (t->rcu_read_lock_nesting == 0 &&
	    unlikely(ACCESS_ONCE(t->rcu_read_unlock_special)))
	    unlikely(ACCESS_ONCE(t->rcu_read_unlock_special)))
		rcu_read_unlock_special(t);
		rcu_read_unlock_special(t);
#ifdef CONFIG_PROVE_LOCKING
#ifdef CONFIG_PROVE_LOCKING