Messages in this thread Patch in this message | | | Date | Mon, 11 May 2020 20:59:37 -0000 | From | "tip-bot2 for Lai Jiangshan" <> | Subject | [tip: core/rcu] rcu: Don't set nesting depth negative in rcu_preempt_deferred_qs() |
| |
The following commit has been merged into the core/rcu branch of tip:
Commit-ID: 07b4a930fc44a537efecf73c1fd2b4937f64caaa Gitweb: https://git.kernel.org/tip/07b4a930fc44a537efecf73c1fd2b4937f64caaa Author: Lai Jiangshan <laijs@linux.alibaba.com> AuthorDate: Sat, 15 Feb 2020 14:37:26 -08:00 Committer: Paul E. McKenney <paulmck@kernel.org> CommitterDate: Mon, 27 Apr 2020 11:03:50 -07:00
rcu: Don't set nesting depth negative in rcu_preempt_deferred_qs()
Now that RCU flavors have been consolidated, an RCU-preempt rcu_read_unlock() in an interrupt or softirq handler cannot possibly end the RCU read-side critical section. Consider the old vulnerability involving rcu_preempt_deferred_qs() being invoked within such a handler that interrupted an extended RCU read-side critical section, in which a wakeup might be invoked with a scheduler lock held. Because rcu_read_unlock_special() no longer does wakeups in such situations, it is no longer necessary for rcu_preempt_deferred_qs() to set the nesting level negative.
This commit therefore removes this recursion-protection code from rcu_preempt_deferred_qs().
[ paulmck: Fix typo in commit log per Steve Rostedt. ] Signed-off-by: Lai Jiangshan <laijs@linux.alibaba.com> Signed-off-by: Paul E. McKenney <paulmck@kernel.org> --- kernel/rcu/tree_plugin.h | 5 ----- 1 file changed, 5 deletions(-)
diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h index ccad776..263c766 100644 --- a/kernel/rcu/tree_plugin.h +++ b/kernel/rcu/tree_plugin.h @@ -569,16 +569,11 @@ static bool rcu_preempt_need_deferred_qs(struct task_struct *t) static void rcu_preempt_deferred_qs(struct task_struct *t) { unsigned long flags; - bool couldrecurse = rcu_preempt_depth() >= 0; if (!rcu_preempt_need_deferred_qs(t)) return; - if (couldrecurse) - rcu_preempt_depth_set(rcu_preempt_depth() - RCU_NEST_BIAS); local_irq_save(flags); rcu_preempt_deferred_qs_irqrestore(t, flags); - if (couldrecurse) - rcu_preempt_depth_set(rcu_preempt_depth() + RCU_NEST_BIAS); } /*
| |