Re: [PATCH] rcu-tasks: Dump rtpcp->lazy_timer status in show_rcu_tasks_generic_gp_kthread()
"Paul E. McKenney" <[email protected]> Fri, 17 Jul 2026 11:00:11 -0700
| Newsgroups | org.kernel.vger.rcu,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <74b5021e-df37-4d3f-815f-0e9c0b303de7@paulmck-laptop> |
On Thu, Jul 16, 2026 at 05:57:54PM +0800, Zqiang wrote: > Add 'P' flag to the diagnostic line to indicate whether any per-cpu > rtpcp's lazy_timer is pending. this helps diagnose stalls where > rcu-task callbacks are queued but the kthread stay sleep because > the lazy_timer has not yet fired and no grace period has started. > > The output is as follows: > > [ 31.319540][ T77] call_rcu_tasks() has failed boot-time tests. > [ 31.320205][ T77] rcu_tasks: RTGS_WAIT_CBS(11) since 7518 g:4 i:0 kCuUP l:150000 > > Signed-off-by: Zqiang <[email protected]> Nice! Queued for review and testing, thank you! Thanx, Paul > --- > kernel/rcu/tasks.h | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h > index 6720dc25cd39..a146d1d98c22 100644 > --- a/kernel/rcu/tasks.h > +++ b/kernel/rcu/tasks.h > @@ -723,6 +723,7 @@ static void show_rcu_tasks_generic_gp_kthread(struct rcu_tasks *rtp, char *s) > bool havecbs = false; > bool haveurgent = false; > bool haveurgentcbs = false; > + bool havependtimer = false; > > for_each_possible_cpu(cpu) { > struct rcu_tasks_percpu *rtpcp = per_cpu_ptr(rtp->rtpcpu, cpu); > @@ -733,10 +734,12 @@ static void show_rcu_tasks_generic_gp_kthread(struct rcu_tasks *rtp, char *s) > haveurgent = true; > if (!data_race(rcu_segcblist_empty(&rtpcp->cblist)) && data_race(rtpcp->urgent_gp)) > haveurgentcbs = true; > - if (havecbs && haveurgent && haveurgentcbs) > + if (data_race(timer_pending(&rtpcp->lazy_timer))) > + havependtimer = true; > + if (havecbs && haveurgent && haveurgentcbs && havependtimer) > break; > } > - pr_info("%s: %s(%d) since %lu g:%lu i:%lu %c%c%c%c l:%lu %s\n", > + pr_info("%s: %s(%d) since %lu g:%lu i:%lu %c%c%c%c%c l:%lu %s\n", > rtp->kname, > tasks_gp_state_getname(rtp), data_race(rtp->gp_state), > jiffies - data_race(rtp->gp_jiffies), > @@ -746,6 +749,7 @@ static void show_rcu_tasks_generic_gp_kthread(struct rcu_tasks *rtp, char *s) > ".C"[havecbs], > ".u"[haveurgent], > ".U"[haveurgentcbs], > + ".P"[havependtimer], > rtp->lazy_jiffies, > s); > } > -- > 2.17.1 > >