rcu: Make rcu_gp_kthread() check for early-boot activity
The rcu_gp_kthread() function immediately sleeps waiting to be notified of the need for a new grace period, which currently works because there are a number of code sequences that will provide the needed wakeup later. However, some of these code sequences need to acquire the root rcu_node structure's ->lock, and contention on that lock has started manifesting. This commit therefore makes rcu_gp_kthread() check for early-boot activity when it starts up, omitting the initial sleep in that case. Reported-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Tested-by: Nicholas Piggin <npiggin@gmail.com>
This commit is contained in:
parent
c91a8675b9
commit
5fe0a56298
|
@ -2192,6 +2192,12 @@ static int __noreturn rcu_gp_kthread(void *arg)
|
|||
struct rcu_state *rsp = arg;
|
||||
struct rcu_node *rnp = rcu_get_root(rsp);
|
||||
|
||||
/* Check for early-boot work. */
|
||||
raw_spin_lock_irq_rcu_node(rnp);
|
||||
if (need_any_future_gp(rnp))
|
||||
WRITE_ONCE(rsp->gp_flags, RCU_GP_FLAG_INIT);
|
||||
raw_spin_unlock_irq_rcu_node(rnp);
|
||||
|
||||
rcu_bind_gp_kthread();
|
||||
for (;;) {
|
||||
|
||||
|
|
Loading…
Reference in New Issue