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. Fixes: c583bcb8f5ed ("rcu: Don't invoke try_invoke_on_locked_down_task() with irqs disabled") Signed-off-by: Yanfei Xu <yanfei.xu@xxxxxxxxxxxxx> --- v1->v2: 1.change the lock function to unlock function. 2.add fixes tag. 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..b09a7140ef77 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_unlock_irqrestore_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