]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
rcutorture: Test start-poll primitives with interrupts disabled
authorPaul E. McKenney <paulmck@kernel.org>
Wed, 9 Oct 2024 18:00:43 +0000 (11:00 -0700)
committerFrederic Weisbecker <frederic@kernel.org>
Tue, 12 Nov 2024 20:44:59 +0000 (21:44 +0100)
This commit tests the ->start_poll() and ->start_poll_full() functions
with interrupts disabled, but only for RCU variants setting the
->start_poll_irqsoff flag.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Reviewed-by: Neeraj Upadhyay <Neeraj.Upadhyay@amd.com>
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
kernel/rcu/rcutorture.c

index bb75dbf5c800cf72b94e6fad4624218ad5a94134..b4cb7623a8bfc15992d44e1fa1cb4e086d2e4463 100644 (file)
@@ -393,6 +393,7 @@ struct rcu_torture_ops {
        int slow_gps;
        int no_pi_lock;
        int debug_objects;
+       int start_poll_irqsoff;
        const char *name;
 };
 
@@ -581,6 +582,7 @@ static struct rcu_torture_ops rcu_ops = {
        .can_boost              = IS_ENABLED(CONFIG_RCU_BOOST),
        .extendables            = RCUTORTURE_MAX_EXTEND,
        .debug_objects          = 1,
+       .start_poll_irqsoff     = 1,
        .name                   = "rcu"
 };
 
@@ -1695,14 +1697,22 @@ rcu_torture_fakewriter(void *arg)
                                cur_ops->cond_sync_exp_full(&gp_snap_full);
                                break;
                        case RTWS_POLL_GET:
+                               if (cur_ops->start_poll_irqsoff)
+                                       local_irq_disable();
                                gp_snap = cur_ops->start_gp_poll();
+                               if (cur_ops->start_poll_irqsoff)
+                                       local_irq_enable();
                                while (!cur_ops->poll_gp_state(gp_snap)) {
                                        torture_hrtimeout_jiffies(torture_random(&rand) % 16,
                                                                  &rand);
                                }
                                break;
                        case RTWS_POLL_GET_FULL:
+                               if (cur_ops->start_poll_irqsoff)
+                                       local_irq_disable();
                                cur_ops->start_gp_poll_full(&gp_snap_full);
+                               if (cur_ops->start_poll_irqsoff)
+                                       local_irq_enable();
                                while (!cur_ops->poll_gp_state_full(&gp_snap_full)) {
                                        torture_hrtimeout_jiffies(torture_random(&rand) % 16,
                                                                  &rand);