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? 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)"); } /*