rcuscale: Add minruntime module parameter
authorPaul E. McKenney <paulmck@kernel.org>
Tue, 16 May 2023 15:22:31 +0000 (08:22 -0700)
committerPaul E. McKenney <paulmck@kernel.org>
Fri, 14 Jul 2023 22:01:49 +0000 (15:01 -0700)
By default, rcuscale collects only 100 points of data per writer, but
arranging for all kthreads to be actively collecting (if not recording)
data during the time that any kthread might be recording.  This works
well, but does not allow much time to bring external performance tools
to bear.  This commit therefore adds a minruntime module parameter
that specifies a minimum data-collection interval in seconds.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Documentation/admin-guide/kernel-parameters.txt
kernel/rcu/rcuscale.c

index 5ba231b786f8b3bb492c08aea2ac4ab0a07cc870..a6888e3dfc202929a729a4480ed4fca4c66e09b2 100644 (file)
                        Number of loops doing rcuscale.kfree_alloc_num number
                        of allocations and frees.
 
+       rcuscale.minruntime= [KNL]
+                       Set the minimum test run time in seconds.  This
+                       does not affect the data-collection interval,
+                       but instead allows better measurement of things
+                       like CPU consumption.
+
        rcuscale.nreaders= [KNL]
                        Set number of RCU readers.  The value -1 selects
                        N, where N is the number of CPUs.  A value
index 15edd8c82933cc1e5e7ba60e3a3cacb4dfbe5626..7c5bab5a4f1969ab59891751038636eee11e6613 100644 (file)
@@ -87,6 +87,7 @@ torture_param(bool, gp_async, false, "Use asynchronous GP wait primitives");
 torture_param(int, gp_async_max, 1000, "Max # outstanding waits per writer");
 torture_param(bool, gp_exp, false, "Use expedited GP wait primitives");
 torture_param(int, holdoff, 10, "Holdoff time before test start (s)");
+torture_param(int, minruntime, 0, "Minimum run time (s)");
 torture_param(int, nreaders, -1, "Number of RCU reader threads");
 torture_param(int, nwriters, -1, "Number of RCU updater threads");
 torture_param(bool, shutdown, RCUSCALE_SHUTDOWN,
@@ -411,6 +412,7 @@ rcu_scale_writer(void *arg)
 {
        int i = 0;
        int i_max;
+       unsigned long jdone;
        long me = (long)arg;
        struct rcu_head *rhp = NULL;
        bool started = false, done = false, alldone = false;
@@ -447,6 +449,7 @@ rcu_scale_writer(void *arg)
                }
        }
 
+       jdone = jiffies + minruntime * HZ;
        do {
                if (writer_holdoff)
                        udelay(writer_holdoff);
@@ -479,7 +482,7 @@ retry:
                if (!started &&
                    atomic_read(&n_rcu_scale_writer_started) >= nrealwriters)
                        started = true;
-               if (!done && i >= MIN_MEAS) {
+               if (!done && i >= MIN_MEAS && time_after(jiffies, jdone)) {
                        done = true;
                        sched_set_normal(current, 0);
                        pr_alert("%s%s rcu_scale_writer %ld has %d measurements\n",