On 07/10/2019 03:26, Paul E. McKenney wrote: > > On Fri, Oct 04, 2019 at 03:24:02PM -0700, Paul E. McKenney wrote: >> On Fri, Oct 04, 2019 at 07:49:10PM +0000, Stefan Reiter wrote: >>> Commit 18cd8c93e69e ("rcu/nocb: Print gp/cb kthread hierarchy if >>> dump_tree") added print statements to rcu_organize_nocb_kthreads for >>> debugging, but incorrectly guarded them, causing the function to always >>> spew out its message. >>> >>> This patch fixes it by guarding both pr_alert statements with dump_tree, >>> while also changing the second pr_alert to a pr_cont, to print the >>> hierarchy in a single line (assuming that's how it was supposed to >>> work). >>> >>> Fixes: 18cd8c93e69e ("rcu/nocb: Print gp/cb kthread hierarchy if dump_tree") >>> Signed-off-by: Stefan Reiter <stefan@xxxxxxxxxx> >> >> Queued for testing and review, thank you! > > And here is an updated version to make the special case of a nocb GP > kthread having no other nocb CB kthreads look less strange. Does this > work for you? Tested just now, works for me. Thanks for the additional fix! > > Thanx, Paul > > ------------------------------------------------------------------------ > > commit e6223b0705369750990c32ddc80251942e61be30 > Author: Stefan Reiter <stefan@xxxxxxxxxx> > Date: Fri Oct 4 19:49:10 2019 +0000 > > rcu/nocb: Fix dump_tree hierarchy print always active > > Commit 18cd8c93e69e ("rcu/nocb: Print gp/cb kthread hierarchy if > dump_tree") added print statements to rcu_organize_nocb_kthreads for > debugging, but incorrectly guarded them, causing the function to always > spew out its message. > > This patch fixes it by guarding both pr_alert statements with dump_tree, > while also changing the second pr_alert to a pr_cont, to print the > hierarchy in a single line (assuming that's how it was supposed to > work). > > Fixes: 18cd8c93e69e ("rcu/nocb: Print gp/cb kthread hierarchy if dump_tree") > Signed-off-by: Stefan Reiter <stefan@xxxxxxxxxx> > [ paulmck: Make single-nocbs-CPU GP kthreads look less erroneous. ] > Signed-off-by: Paul E. McKenney <paulmck@xxxxxxxxxx> > > diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h > index d5334e4..d43f4e0 100644 > --- a/kernel/rcu/tree_plugin.h > +++ b/kernel/rcu/tree_plugin.h > @@ -2295,6 +2295,8 @@ static void __init rcu_organize_nocb_kthreads(void) > { > int cpu; > bool firsttime = true; > + bool gotnocbs = false; > + bool gotnocbscbs = true; > int ls = rcu_nocb_gp_stride; > int nl = 0; /* Next GP kthread. */ > struct rcu_data *rdp; > @@ -2317,21 +2319,31 @@ static void __init rcu_organize_nocb_kthreads(void) > rdp = per_cpu_ptr(&rcu_data, cpu); > if (rdp->cpu >= nl) { > /* New GP kthread, set up for CBs & next GP. */ > + gotnocbs = true; > nl = DIV_ROUND_UP(rdp->cpu + 1, ls) * ls; > rdp->nocb_gp_rdp = rdp; > rdp_gp = rdp; > - if (!firsttime && dump_tree) > - pr_cont("\n"); > - firsttime = false; > - pr_alert("%s: No-CB GP kthread CPU %d:", __func__, cpu); > + if (dump_tree) { > + if (!firsttime) > + pr_cont("%s\n", gotnocbscbs > + ? "" : " (self only)"); > + gotnocbscbs = false; > + firsttime = false; > + pr_alert("%s: No-CB GP kthread CPU %d:", > + __func__, cpu); > + } > } else { > /* Another CB kthread, link to previous GP kthread. */ > + gotnocbscbs = true; > rdp->nocb_gp_rdp = rdp_gp; > rdp_prev->nocb_next_cb_rdp = rdp; > - pr_alert(" %d", cpu); > + if (dump_tree) > + pr_cont(" %d", cpu); > } > rdp_prev = rdp; > } > + if (gotnocbs && dump_tree) > + pr_cont("%s\n", gotnocbscbs ? "" : " (self only)"); > } > > /* >