]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
rcutorture: Add per-reader-segment preemption diagnostics
authorPaul E. McKenney <paulmck@kernel.org>
Thu, 14 Nov 2024 03:10:19 +0000 (19:10 -0800)
committerUladzislau Rezki (Sony) <urezki@gmail.com>
Sat, 14 Dec 2024 16:05:52 +0000 (17:05 +0100)
For preemptible RCU, this commit adds an indication for each
reader segments to whether the rcu_torture_reader() task was
on the ->blkd_tasks lists, though only in kernels built with
CONFIG_RCU_TORTURE_TEST_LOG_CPU=y.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com>
kernel/rcu/rcutorture.c

index ab354bb7f1b682f3efeb3acd8b9640da83b996a2..41b661bf000a7be5f04cbba740a19914433498cd 100644 (file)
@@ -464,10 +464,8 @@ rcu_read_delay(struct torture_random_state *rrsp, struct rt_read_seg *rtrsp)
                rtrsp->rt_delay_us = shortdelay_us;
        }
        if (!preempt_count() &&
-           !(torture_random(rrsp) % (nrealreaders * 500))) {
+           !(torture_random(rrsp) % (nrealreaders * 500)))
                torture_preempt_schedule();  /* QS only if preemptible. */
-               rtrsp->rt_preempted = true;
-       }
 }
 
 static void rcu_torture_read_unlock(int idx)
@@ -1961,8 +1959,11 @@ static void rcutorture_one_extend(int *readstate, int newstate, bool insoftirq,
        if (IS_ENABLED(CONFIG_RCU_TORTURE_TEST_LOG_CPU)) {
                int cpu = raw_smp_processor_id();
                rtrsp->rt_cpu = cpu;
-               if (!first)
+               if (!first) {
                        rtrsp[-1].rt_end_cpu = cpu;
+                       if (cur_ops->reader_blocked)
+                               rtrsp[-1].rt_preempted = cur_ops->reader_blocked();
+               }
        }
 
        /*