On Tue 2016-11-29 09:36:00, Paul E. McKenney wrote: > Updated (but still untested) commit below. > > > Thanx, Paul > > ------------------------------------------------------------------------ > > commit d3df9bc5fb5d838b049f32a476721eadbc349553 > Author: Paul E. McKenney <paul...@linux.vnet.ibm.com> > Date: Tue Nov 29 05:49:06 2016 -0800 > > rcu: Once again use NMI-based stack traces in stall warnings > > This commit is for all intents and purposes a revert of bc1dce514e9b > ("rcu: Don't use NMIs to dump other CPUs' stacks"). The reason to suppose > that this can now safely be reverted is the presence of 42a0bb3f7138 > ("printk/nmi: generic solution for safe printk in NMI"), which is said > to have made NMI-based stack dumps safe. > > However, this reversion keeps one nice property of bc1dce514e9b > ("rcu: Don't use NMIs to dump other CPUs' stacks"), namely that > only those CPUs blocking the grace period are dumped. The new > trigger_single_cpu_backtrace() is used to make this happen, as > suggested by Josh Poimboeuf. > > Reported-by: Vince Weaver <vincent.wea...@maine.edu> > Not-yet-signed-off-by: Paul E. McKenney <paul...@linux.vnet.ibm.com> > Cc: Petr Mladek <pmla...@suse.com> > Cc: Peter Zijlstra <pet...@infradead.org> > Reviewed-by: Josh Poimboeuf <jpoim...@redhat.com>
Looks fine to me. Reviewed-by: Petr Mladek <pmla...@suse.com> Best Regards, Petr > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c > index 91a68e4e6671..ba0e4825be9d 100644 > --- a/kernel/rcu/tree.c > +++ b/kernel/rcu/tree.c > @@ -1396,7 +1396,10 @@ static void rcu_check_gp_kthread_starvation(struct > rcu_state *rsp) > } > > /* > - * Dump stacks of all tasks running on stalled CPUs. > + * Dump stacks of all tasks running on stalled CPUs. First try using > + * NMIs, but fall back to manual remote stack tracing on architectures > + * that don't support NMI-based stack dumps. The NMI-triggered stack > + * traces are more accurate because they are printed by the target CPU. > */ > static void rcu_dump_cpu_stacks(struct rcu_state *rsp) > { > @@ -1406,11 +1409,10 @@ static void rcu_dump_cpu_stacks(struct rcu_state *rsp) > > rcu_for_each_leaf_node(rsp, rnp) { > raw_spin_lock_irqsave_rcu_node(rnp, flags); > - if (rnp->qsmask != 0) { > - for_each_leaf_node_possible_cpu(rnp, cpu) > - if (rnp->qsmask & leaf_node_cpu_bit(rnp, cpu)) > + for_each_leaf_node_possible_cpu(rnp, cpu) > + if (rnp->qsmask & leaf_node_cpu_bit(rnp, cpu)) > + if (!trigger_single_cpu_backtrace(cpu)) > dump_cpu_task(cpu); > - } > raw_spin_unlock_irqrestore_rcu_node(rnp, flags); > } > } >