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 /include/linux | |
| 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 'include/linux')
| -rw-r--r-- | include/linux/srcu.h | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/include/linux/srcu.h b/include/linux/srcu.h index a2783cb5d275..6dddbd931ff2 100644 --- a/include/linux/srcu.h +++ b/include/linux/srcu.h @@ -217,8 +217,11 @@ static inline int srcu_read_lock_held(struct srcu_struct *sp) */ static inline int srcu_read_lock(struct srcu_struct *sp) __acquires(sp) { - int retval = __srcu_read_lock(sp); + int retval; + preempt_disable(); + retval = __srcu_read_lock(sp); + preempt_enable(); rcu_lock_acquire(&(sp)->dep_map); return retval; } |
