On Thu, Jun 24, 2021 at 10:34:24PM +0800, Jiangong.Han wrote: > The rcuscale console output claims N grace periods, numbered from zero > to N, which means that there were really N+1 grace periods. The root > cause of this bug is that rcu_scale_writer() stores the number of the > last grace period (numbered from zero) into writer_n_durations[me] > instead of the number of grace periods. This commit therefore assigns > the actual number of grace periods to writer_n_durations[me], and also > makes the corresponding adjustment to the loop outputting per-grace-period > measurements. > > Sample of old console output: > rcu-scale: writer 0 gps: 133 > ...... > rcu-scale: 0 writer-duration: 0 44003961 > rcu-scale: 0 writer-duration: 1 32003582 > ...... > rcu-scale: 0 writer-duration: 132 28004391 > rcu-scale: 0 writer-duration: 133 27996410 > > Sample of new console output: > rcu-scale: writer 0 gps: 134 > ...... > rcu-scale: 0 writer-duration: 0 44003961 > rcu-scale: 0 writer-duration: 1 32003582 > ...... > rcu-scale: 0 writer-duration: 132 28004391 > rcu-scale: 0 writer-duration: 133 27996410 > > Signed-off-by: Jiangong.Han <jiangong.han@xxxxxxxxxxxxx> > Signed-off-by: Paul E. McKenney <paulmck@xxxxxxxxxx> I already have it queued in -rcu here: 4c154a910344 ("rcuscale: Console output claims too few grace periods") Or did you find an error in my wordsmithed version of your commit log? If so, please point out the error explicitly. (It looks identical to me, but I could easily be missing something.) Thanx, Paul > --- > kernel/rcu/rcuscale.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/kernel/rcu/rcuscale.c b/kernel/rcu/rcuscale.c > index dca51fe9c73f..2cc34a22a506 100644 > --- a/kernel/rcu/rcuscale.c > +++ b/kernel/rcu/rcuscale.c > @@ -487,7 +487,7 @@ rcu_scale_writer(void *arg) > if (gp_async) { > cur_ops->gp_barrier(); > } > - writer_n_durations[me] = i_max; > + writer_n_durations[me] = i_max + 1; > torture_kthread_stopping("rcu_scale_writer"); > return 0; > } > @@ -561,7 +561,7 @@ rcu_scale_cleanup(void) > wdpp = writer_durations[i]; > if (!wdpp) > continue; > - for (j = 0; j <= writer_n_durations[i]; j++) { > + for (j = 0; j < writer_n_durations[i]; j++) { > wdp = &wdpp[j]; > pr_alert("%s%s %4d writer-duration: %5d %llu\n", > scale_type, SCALE_FLAG, > -- > 2.17.1 >