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 <paul...@kernel.org>
Signed-off-by: Uladzislau Rezki (Sony) <ure...@gmail.com>
---
 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


Reply via email to