Skip to content

Commit 9650edd

Browse files
paulmckrcuFrederic Weisbecker
authored andcommitted
rcu: Finer-grained grace-period-end checks in rcu_dump_cpu_stacks()
This commit pushes the grace-period-end checks further down into rcu_dump_cpu_stacks(), and also uses lockless checks coupled with finer-grained locking. The result is that the current leaf rcu_node structure's ->lock is acquired only if a stack backtrace might be needed from the current CPU, and is held across only that CPU's backtrace. As a result, if there are no stalled CPUs associated with a given rcu_node structure, then its ->lock will not be acquired at all. On large systems, it is usually (though not always) the case that a small number of CPUs are stalling the current grace period, which means that the ->lock need be acquired only for a small fraction of the rcu_node structures. [ paulmck: Apply Dan Carpenter feedback. ] Signed-off-by: Paul E. McKenney <[email protected]> Reviewed-by: Joel Fernandes (Google) <[email protected]> Signed-off-by: Frederic Weisbecker <[email protected]>
1 parent cbe644a commit 9650edd

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

kernel/rcu/tree_stall.h

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -342,20 +342,24 @@ static void rcu_dump_cpu_stacks(unsigned long gp_seq)
342342
struct rcu_node *rnp;
343343

344344
rcu_for_each_leaf_node(rnp) {
345-
if (gp_seq != data_race(rcu_state.gp_seq)) {
346-
pr_err("INFO: Stall ended during stack backtracing.\n");
347-
return;
348-
}
349345
printk_deferred_enter();
350-
raw_spin_lock_irqsave_rcu_node(rnp, flags);
351-
for_each_leaf_node_possible_cpu(rnp, cpu)
346+
for_each_leaf_node_possible_cpu(rnp, cpu) {
347+
if (gp_seq != data_race(rcu_state.gp_seq)) {
348+
printk_deferred_exit();
349+
pr_err("INFO: Stall ended during stack backtracing.\n");
350+
return;
351+
}
352+
if (!(data_race(rnp->qsmask) & leaf_node_cpu_bit(rnp, cpu)))
353+
continue;
354+
raw_spin_lock_irqsave_rcu_node(rnp, flags);
352355
if (rnp->qsmask & leaf_node_cpu_bit(rnp, cpu)) {
353356
if (cpu_is_offline(cpu))
354357
pr_err("Offline CPU %d blocking current GP.\n", cpu);
355358
else
356359
dump_cpu_task(cpu);
357360
}
358-
raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
361+
raw_spin_unlock_irqrestore_rcu_node(rnp, flags);
362+
}
359363
printk_deferred_exit();
360364
}
361365
}

0 commit comments

Comments
 (0)