|
@@ -201,7 +201,7 @@ static void rcu_preempt_note_context_switch(int cpu)
|
|
|
*/
|
|
|
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 */
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(__rcu_read_lock);
|
|
@@ -344,7 +344,9 @@ void __rcu_read_unlock(void)
|
|
|
struct task_struct *t = current;
|
|
|
|
|
|
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)))
|
|
|
rcu_read_unlock_special(t);
|
|
|
#ifdef CONFIG_PROVE_LOCKING
|