diff options
author | Paul E. McKenney <paulmck@linux.vnet.ibm.com> | 2015-09-01 00:42:57 -0700 |
---|---|---|
committer | Ben Hutchings <ben@decadent.org.uk> | 2017-09-15 18:30:07 +0100 |
commit | b689af6529625a3d589f3f9b359a766e4c614ae4 (patch) | |
tree | 92dd7141488f1ee911100614ff05ee3322760f35 /kernel | |
parent | 46ef30652bf56cc42c4ed79f168192055a0b357f (diff) |
rcu: Move preemption disabling out of __srcu_read_lock()
commit 49f5903b473c5f63f3b57856d1bd4593db0a2eef upstream.
Currently, __srcu_read_lock() cannot be invoked from restricted
environments because it contains calls to preempt_disable() and
preempt_enable(), both of which can invoke lockdep, which is a bad
idea in some restricted execution modes. This commit therefore moves
the preempt_disable() and preempt_enable() from __srcu_read_lock()
to srcu_read_lock(). It also inserts the preempt_disable() and
preempt_enable() around the call to __srcu_read_lock() in do_exit().
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
[bwh: Backported to 3.16:
- Drop changes in do_exit()
- Adjust context]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/rcu/srcu.c | 2 |
1 files changed, 0 insertions, 2 deletions
diff --git a/kernel/rcu/srcu.c b/kernel/rcu/srcu.c index c639556f3fa0..d2c8dcefdbdb 100644 --- a/kernel/rcu/srcu.c +++ b/kernel/rcu/srcu.c @@ -297,11 +297,9 @@ int __srcu_read_lock(struct srcu_struct *sp) int idx; idx = ACCESS_ONCE(sp->completed) & 0x1; - preempt_disable(); ACCESS_ONCE(this_cpu_ptr(sp->per_cpu_ref)->c[idx]) += 1; smp_mb(); /* B */ /* Avoid leaking the critical section. */ ACCESS_ONCE(this_cpu_ptr(sp->per_cpu_ref)->seq[idx]) += 1; - preempt_enable(); return idx; } EXPORT_SYMBOL_GPL(__srcu_read_lock); |