rcutorture: Force occasional reader waits
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Wed, 4 Jul 2018 21:14:42 +0000 (14:14 -0700)
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Wed, 29 Aug 2018 16:20:48 +0000 (09:20 -0700)
Deferred quiescent states can interact with the scheduler, but
rcu_torture_reader() does not force such interaction all that frequently.
This commit therefore blocks for one jiffy after ten jiffies of read-side
runtime.  This has the beneficial effect of being most likely to block
just after long-running readers, and it is exactly these readers that
are most likely to have been preempted (in CONFIG_PREEMPT=y kernels).
This in turn helps increase the probability that a deferred quiescent
state will be seen by RCU's context-switch hooks.

Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
kernel/rcu/rcutorture.c

index c596c6f1e45717af99da5139d3c5078782deafbe..50a4f0ed4ebf804694b202d9b2058962aca36409 100644 (file)
@@ -1387,6 +1387,7 @@ static void rcu_torture_timer(struct timer_list *unused)
 static int
 rcu_torture_reader(void *arg)
 {
+       unsigned long lastsleep = jiffies;
        DEFINE_TORTURE_RANDOM(rand);
        struct timer_list t;
 
@@ -1402,6 +1403,10 @@ rcu_torture_reader(void *arg)
                }
                if (!rcu_torture_one_read(&rand))
                        schedule_timeout_interruptible(HZ);
+               if (time_after(jiffies, lastsleep)) {
+                       schedule_timeout_interruptible(1);
+                       lastsleep = jiffies + 10;
+               }
                stutter_wait("rcu_torture_reader");
        } while (!torture_must_stop());
        if (irqreader && cur_ops->irq_capable) {