diff options
author | Paul E. McKenney <paulmck@kernel.org> | 2020-12-22 16:49:11 -0800 |
---|---|---|
committer | Paul E. McKenney <paulmck@kernel.org> | 2021-01-06 16:50:24 -0800 |
commit | 147c6852d34563b87ff0e67383c2bf675e8248f6 (patch) | |
tree | d43946d4b9687a590f52e3b2db91f4f7b54155e9 /kernel/rcu | |
parent | f759081e8f5ac640df1c7125540759bbcb4eb0e2 (diff) | |
download | lwn-147c6852d34563b87ff0e67383c2bf675e8248f6.tar.gz lwn-147c6852d34563b87ff0e67383c2bf675e8248f6.zip |
rcu: Do any deferred nocb wakeups at CPU offline time
Because the need to wake a nocb GP kthread ("rcuog") is sometimes
detected when wakeups cannot be done, these wakeups can be deferred.
The wakeups are then carried out by calls to do_nocb_deferred_wakeup()
at various safe points in the code, including RCU's idle hooks. However,
when a CPU goes offline, it invokes arch_cpu_idle_dead() without invoking
any of RCU's idle hooks.
This commit therefore adds a call to do_nocb_deferred_wakeup() in
rcu_report_dead() in order to handle any deferred wakeups that have been
requested by the outgoing CPU.
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Diffstat (limited to 'kernel/rcu')
-rw-r--r-- | kernel/rcu/tree.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 03810a58fdd0..e6dee714efe0 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -4178,6 +4178,9 @@ void rcu_report_dead(unsigned int cpu) struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu); struct rcu_node *rnp = rdp->mynode; /* Outgoing CPU's rdp & rnp. */ + // Do any dangling deferred wakeups. + do_nocb_deferred_wakeup(rdp); + /* QS for any half-done expedited grace period. */ preempt_disable(); rcu_report_exp_rdp(this_cpu_ptr(&rcu_data)); |