]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
rcutorture: Pull rcu_torture_updown() loop body into new function
authorPaul E. McKenney <paulmck@kernel.org>
Sun, 9 Feb 2025 12:58:36 +0000 (04:58 -0800)
committerNeeraj Upadhyay (AMD) <neeraj.upadhyay@kernel.org>
Wed, 25 Jun 2025 03:09:01 +0000 (08:39 +0530)
This is strictly a code-movement commit, pulling that part of
the rcu_torture_updown() function's loop body that processes
one rcu_torture_one_read_state_updown structure into a new
rcu_torture_updown_one() function.  The checks for the end of the
torture test and the current structure being in use remain in the
rcu_torture_updown() function.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Joel Fernandes <joelagnelf@nvidia.com>
Signed-off-by: Neeraj Upadhyay (AMD) <neeraj.upadhyay@kernel.org>
kernel/rcu/rcutorture.c

index bf87c0c4e77e328ebdb61ddc5dd3522271cf2df3..13cf0e47286891ad19e55a23795c9b3505a8cb81 100644 (file)
@@ -2513,6 +2513,29 @@ static void rcu_torture_updown_cleanup(void)
        updownreaders = NULL;
 }
 
+// Do one reader for rcu_torture_updown().
+static void rcu_torture_updown_one(struct rcu_torture_one_read_state_updown *rtorsup)
+{
+       int idx;
+       int rawidx;
+       ktime_t t;
+
+       init_rcu_torture_one_read_state(&rtorsup->rtorsu_rtors, &rtorsup->rtorsu_trs);
+       rawidx = cur_ops->down_read();
+       idx = (rawidx << RCUTORTURE_RDR_SHIFT_1) & RCUTORTURE_RDR_MASK_1;
+       rtorsup->rtorsu_rtors.readstate = idx | RCUTORTURE_RDR_UPDOWN;
+       rtorsup->rtorsu_rtors.rtrsp++;
+       if (!rcu_torture_one_read_start(&rtorsup->rtorsu_rtors, &rtorsup->rtorsu_trs, -1)) {
+               schedule_timeout_idle(HZ);
+               return;
+       }
+       smp_store_release(&rtorsup->rtorsu_inuse, true);
+       t = torture_random(&rtorsup->rtorsu_trs) & 0xfffff; // One per million.
+       if (t < 10 * 1000)
+               t = 200 * 1000 * 1000;
+       hrtimer_start(&rtorsup->rtorsu_hrt, t, HRTIMER_MODE_REL | HRTIMER_MODE_SOFT);
+}
+
 /*
  * RCU torture up/down reader kthread, starting RCU readers in kthread
  * context and ending them in hrtimer handlers.  Otherwise similar to
@@ -2521,10 +2544,7 @@ static void rcu_torture_updown_cleanup(void)
 static int
 rcu_torture_updown(void *arg)
 {
-       int idx;
-       int rawidx;
        struct rcu_torture_one_read_state_updown *rtorsup;
-       ktime_t t;
 
        VERBOSE_TOROUT_STRING("rcu_torture_updown task started");
        do {
@@ -2533,23 +2553,7 @@ rcu_torture_updown(void *arg)
                                break;
                        if (smp_load_acquire(&rtorsup->rtorsu_inuse))
                                continue;
-                       init_rcu_torture_one_read_state(&rtorsup->rtorsu_rtors,
-                                                       &rtorsup->rtorsu_trs);
-                       rawidx = cur_ops->down_read();
-                       idx = (rawidx << RCUTORTURE_RDR_SHIFT_1) & RCUTORTURE_RDR_MASK_1;
-                       rtorsup->rtorsu_rtors.readstate = idx | RCUTORTURE_RDR_UPDOWN;
-                       rtorsup->rtorsu_rtors.rtrsp++;
-                       if (!rcu_torture_one_read_start(&rtorsup->rtorsu_rtors,
-                                                       &rtorsup->rtorsu_trs, -1)) {
-                               schedule_timeout_idle(HZ);
-                               continue;
-                       }
-                       smp_store_release(&rtorsup->rtorsu_inuse, true);
-                       t = torture_random(&rtorsup->rtorsu_trs) & 0xfffff; // One per million.
-                       if (t < 10 * 1000)
-                               t = 200 * 1000 * 1000;
-                       hrtimer_start(&rtorsup->rtorsu_hrt, t,
-                                     HRTIMER_MODE_REL | HRTIMER_MODE_SOFT);
+                       rcu_torture_updown_one(rtorsup);
                }
                torture_hrtimeout_ms(1, 1000, &rcu_torture_updown_rand);
                stutter_wait("rcu_torture_updown");