summaryrefslogtreecommitdiff
path: root/kernel/rcu/rcutorture.c
diff options
context:
space:
mode:
authorPaul E. McKenney <paulmck@linux.vnet.ibm.com>2018-07-19 13:07:20 -0700
committerPaul E. McKenney <paulmck@linux.vnet.ibm.com>2018-08-29 09:20:48 -0700
commit08a7a2ec68348ebc6d8bf5f20df23815fc0d332b (patch)
treeda28486608c70a53dff7dc4276053e45b8405c35 /kernel/rcu/rcutorture.c
parent152f4afbfd58f8ada7591113129aa6ba7fe114c5 (diff)
rcutorture: Vary forward-progress test interval
Some of the Linux kernel's RCU implementations provide several mechanisms to promote forward progress that operate over different timeframes. This commit therefore causes rcu_torture_fwd_prog() to vary the duration of its forward-progress testing in order to test each such mechanism. Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Diffstat (limited to 'kernel/rcu/rcutorture.c')
-rw-r--r--kernel/rcu/rcutorture.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index 8ab23143c244..89cc4d9c9a0c 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -1676,16 +1676,21 @@ static int rcu_torture_fwd_prog(void *args)
unsigned long cver;
unsigned long gps;
int idx;
+ int sd;
+ int sd4;
unsigned long stopat;
bool tested = false;
int tested_tries = 0;
+ static DEFINE_TORTURE_RANDOM(trs);
VERBOSE_TOROUT_STRING("rcu_torture_fwd_progress task started");
do {
schedule_timeout_interruptible(fwd_progress_holdoff * HZ);
cver = READ_ONCE(rcu_torture_current_version);
gps = cur_ops->get_gp_seq();
- stopat = jiffies + cur_ops->stall_dur() / fwd_progress_div;
+ sd = cur_ops->stall_dur() + 1;
+ sd4 = (sd + fwd_progress_div - 1) / fwd_progress_div;
+ stopat = jiffies + sd4 + torture_random(&trs) % (sd - sd4);
while (time_before(jiffies, stopat) && !torture_must_stop()) {
idx = cur_ops->readlock();
udelay(10);