From: Yanfei Xu <yanfei.xu@xxxxxxxxxxxxx> rcu_node->lock isn't released in rcu_print_task_stall() if the rcu_node don't contain tasks which blocking the GP. However this rcu_node->lock will be used again in rcu_dump_cpu_stacks() soon while the ndetected is non-zero. As a result the cpu will hung by this deadlock. Signed-off-by: Yanfei Xu <yanfei.xu@xxxxxxxxxxxxx> --- kernel/rcu/tree_stall.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/kernel/rcu/tree_stall.h b/kernel/rcu/tree_stall.h index b72311d24a9f..4e97c9977d1c 100644 --- a/kernel/rcu/tree_stall.h +++ b/kernel/rcu/tree_stall.h @@ -267,8 +267,10 @@ static int rcu_print_task_stall(struct rcu_node *rnp, unsigned long flags) struct task_struct *ts[8]; lockdep_assert_irqs_disabled(); - if (!rcu_preempt_blocked_readers_cgp(rnp)) + if (!rcu_preempt_blocked_readers_cgp(rnp)) { + raw_spin_lock_irqsave_rcu_node(rnp, flags); return 0; + } pr_err("\tTasks blocked on level-%d rcu_node (CPUs %d-%d):", rnp->level, rnp->grplo, rnp->grphi); t = list_entry(rnp->gp_tasks->prev, -- 2.27.0