Commit 8d67c155 authored by Uladzislau Rezki (Sony)'s avatar Uladzislau Rezki (Sony) Committed by Boqun Feng
Browse files

rcutorture: Allow a negative value for nfakewriters



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.

Reviewed-by: default avatarPaul E. McKenney <paulmck@kernel.org>
Signed-off-by: default avatarUladzislau Rezki (Sony) <urezki@gmail.com>
Link: https://lore.kernel.org/r/20250227131613.52683-1-urezki@gmail.com


Signed-off-by: default avatarBoqun Feng <boqun.feng@gmail.com>
parent 6ea9a178
Loading
Loading
Loading
Loading
+16 −6
Original line number Diff line number Diff line
@@ -147,6 +147,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;
@@ -1728,7 +1729,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]) {
@@ -2522,7 +2523,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,
@@ -3597,7 +3598,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);
@@ -3994,6 +3995,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 {
@@ -4050,8 +4059,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) {
@@ -4060,7 +4070,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))