On Mon, Feb 24, 2025 at 02:36:57PM +0100, Uladzislau Rezki (Sony) wrote: > Currently "nfakewriters" parameter can be set to any value but > there is no possibility to adjust it automatically based on how > many CPUs a system has where a test is run on. > > To address this, if the "nfakewriters" is set to negative it will > be adjusted to num_online_cpus() during torture initialization. > > Signed-off-by: Uladzislau Rezki (Sony) <urezki@xxxxxxxxx> Reviewed-by: Paul E. McKenney <paulmck@xxxxxxxxxx> > --- > kernel/rcu/rcutorture.c | 22 ++++++++++++++++------ > 1 file changed, 16 insertions(+), 6 deletions(-) > > diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c > index d98b3bd6d91f..f376262532ce 100644 > --- a/kernel/rcu/rcutorture.c > +++ b/kernel/rcu/rcutorture.c > @@ -148,6 +148,7 @@ MODULE_PARM_DESC(torture_type, "Type of RCU to torture (rcu, srcu, ...)"); > > static int nrealnocbers; > static int nrealreaders; > +static int nrealfakewriters; > static struct task_struct *writer_task; > static struct task_struct **fakewriter_tasks; > static struct task_struct **reader_tasks; > @@ -1763,7 +1764,7 @@ rcu_torture_fakewriter(void *arg) > do { > torture_hrtimeout_jiffies(torture_random(&rand) % 10, &rand); > if (cur_ops->cb_barrier != NULL && > - torture_random(&rand) % (nfakewriters * 8) == 0) { > + torture_random(&rand) % (nrealfakewriters * 8) == 0) { > cur_ops->cb_barrier(); > } else { > switch (synctype[torture_random(&rand) % nsynctypes]) { > @@ -2568,7 +2569,7 @@ rcu_torture_print_module_parms(struct rcu_torture_ops *cur_ops, const char *tag) > "nocbs_nthreads=%d nocbs_toggle=%d " > "test_nmis=%d " > "preempt_duration=%d preempt_interval=%d\n", > - torture_type, tag, nrealreaders, nfakewriters, > + torture_type, tag, nrealreaders, nrealfakewriters, > stat_interval, verbose, test_no_idle_hz, shuffle_interval, > stutter, irqreader, fqs_duration, fqs_holdoff, fqs_stutter, > test_boost, cur_ops->can_boost, > @@ -3644,7 +3645,7 @@ rcu_torture_cleanup(void) > rcu_torture_reader_mbchk = NULL; > > if (fakewriter_tasks) { > - for (i = 0; i < nfakewriters; i++) > + for (i = 0; i < nrealfakewriters; i++) > torture_stop_kthread(rcu_torture_fakewriter, > fakewriter_tasks[i]); > kfree(fakewriter_tasks); > @@ -4066,6 +4067,14 @@ rcu_torture_init(void) > > rcu_torture_init_srcu_lockdep(); > > + if (nfakewriters >= 0) { > + nrealfakewriters = nfakewriters; > + } else { > + nrealfakewriters = num_online_cpus() - 2 - nfakewriters; > + if (nrealfakewriters <= 0) > + nrealfakewriters = 1; > + } > + > if (nreaders >= 0) { > nrealreaders = nreaders; > } else { > @@ -4122,8 +4131,9 @@ rcu_torture_init(void) > writer_task); > if (torture_init_error(firsterr)) > goto unwind; > - if (nfakewriters > 0) { > - fakewriter_tasks = kcalloc(nfakewriters, > + > + if (nrealfakewriters > 0) { > + fakewriter_tasks = kcalloc(nrealfakewriters, > sizeof(fakewriter_tasks[0]), > GFP_KERNEL); > if (fakewriter_tasks == NULL) { > @@ -4132,7 +4142,7 @@ rcu_torture_init(void) > goto unwind; > } > } > - for (i = 0; i < nfakewriters; i++) { > + for (i = 0; i < nrealfakewriters; i++) { > firsterr = torture_create_kthread(rcu_torture_fakewriter, > NULL, fakewriter_tasks[i]); > if (torture_init_error(firsterr)) > -- > 2.39.5 >