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 <paul...@kernel.org>
---
 kernel/rcu/rcutorture.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index bb75dbf5c800c..b4cb7623a8bfc 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -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);
-- 
2.40.1


Reply via email to