Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a6058d85 authored by Paul E. McKenney's avatar Paul E. McKenney
Browse files

rcu: Avoid __call_rcu_core() root rcu_node ->lock acquisition



When __call_rcu_core() notices excessive numbers of callbacks pending
on the current CPU, we know that at least one of them is not yet
classified, namely the one that was just now queued.  Therefore, it
is not necessary to invoke rcu_start_gp() and thus not necessary to
acquire the root rcu_node structure's ->lock.  This commit therefore
replaces the rcu_start_gp() with rcu_accelerate_cbs(), thus replacing
an acquisition of the root rcu_node structure's ->lock with that of
this CPU's leaf rcu_node structure.

This decreases contention on the root rcu_node structure's ->lock.

Reported-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Tested-by: default avatarNicholas Piggin <npiggin@gmail.com>
parent ec4eacce
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -2988,11 +2988,11 @@ static void __call_rcu_core(struct rcu_state *rsp, struct rcu_data *rdp,

		/* Start a new grace period if one not already started. */
		if (!rcu_gp_in_progress(rsp)) {
			struct rcu_node *rnp_root = rcu_get_root(rsp);
			struct rcu_node *rnp = rdp->mynode;

			raw_spin_lock_rcu_node(rnp_root);
			needwake = rcu_start_gp(rsp);
			raw_spin_unlock_rcu_node(rnp_root);
			raw_spin_lock_rcu_node(rnp);
			needwake = rcu_accelerate_cbs(rsp, rnp, rdp);
			raw_spin_unlock_rcu_node(rnp);
			if (needwake)
				rcu_gp_kthread_wake(rsp);
		} else {