]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
rcutorture: Allow a negative value for nfakewriters
authorUladzislau Rezki (Sony) <urezki@gmail.com>
Thu, 27 Feb 2025 13:16:11 +0000 (14:16 +0100)
committerBoqun Feng <boqun.feng@gmail.com>
Wed, 5 Mar 2025 02:44:29 +0000 (18:44 -0800)
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: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com>
Link: https://lore.kernel.org/r/20250227131613.52683-1-urezki@gmail.com
Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
kernel/rcu/rcutorture.c

index d26fb1d33ed9ae60e87ab8a2ec919bce8cd89d42..726c2d63ab66f7bbd0fc6b8db45cd2369ed6ed94 100644 (file)
@@ -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))