diff --git a/kernel/rcu/tree_stall.h b/kernel/rcu/tree_stall.h index 195cad14742dd7..aa10fff2359c70 100644 --- a/kernel/rcu/tree_stall.h +++ b/kernel/rcu/tree_stall.h @@ -350,6 +350,21 @@ static int rcu_print_task_stall(struct rcu_node *rnp, unsigned long flags) } #endif /* #else #ifdef CONFIG_PREEMPT_RCU */ +static void rcu_dump_cpu_task(int cpu) +{ + if (cpu == smp_processor_id() && in_irq()) { + struct pt_regs *regs; + + regs = get_irq_regs(); + if (regs) { + show_regs(regs); + return; + } + } + + dump_cpu_task(cpu); +} + /* * Dump stacks of all tasks running on stalled CPUs. First try using * NMIs, but fall back to manual remote stack tracing on architectures @@ -369,7 +384,7 @@ static void rcu_dump_cpu_stacks(void) if (cpu_is_offline(cpu)) pr_err("Offline CPU %d blocking current GP.\n", cpu); else if (!trigger_single_cpu_backtrace(cpu)) - dump_cpu_task(cpu); + rcu_dump_cpu_task(cpu); } raw_spin_unlock_irqrestore_rcu_node(rnp, flags); }