rcutorture: add random preemption
Add random preemption to help we to torture the preemptable rcu. srcu_read_delay() also calls rcu_read_delay() for shorter delays. Added comment to preempt_schedule() call indicating that no quiescent states happen if preemption is disabled. Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Reviewed-by: Josh Triplett <josh@joshtriplett.org>
This commit is contained in:
parent
84483ea42c
commit
e546f485e1
|
@ -303,6 +303,10 @@ static void rcu_read_delay(struct rcu_random_state *rrsp)
|
||||||
mdelay(longdelay_ms);
|
mdelay(longdelay_ms);
|
||||||
if (!(rcu_random(rrsp) % (nrealreaders * 2 * shortdelay_us)))
|
if (!(rcu_random(rrsp) % (nrealreaders * 2 * shortdelay_us)))
|
||||||
udelay(shortdelay_us);
|
udelay(shortdelay_us);
|
||||||
|
#ifdef CONFIG_PREEMPT
|
||||||
|
if (!preempt_count() && !(rcu_random(rrsp) % (nrealreaders * 20000)))
|
||||||
|
preempt_schedule(); /* No QS if preempt_disable() in effect */
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rcu_torture_read_unlock(int idx) __releases(RCU)
|
static void rcu_torture_read_unlock(int idx) __releases(RCU)
|
||||||
|
@ -536,6 +540,8 @@ static void srcu_read_delay(struct rcu_random_state *rrsp)
|
||||||
delay = rcu_random(rrsp) % (nrealreaders * 2 * longdelay * uspertick);
|
delay = rcu_random(rrsp) % (nrealreaders * 2 * longdelay * uspertick);
|
||||||
if (!delay)
|
if (!delay)
|
||||||
schedule_timeout_interruptible(longdelay);
|
schedule_timeout_interruptible(longdelay);
|
||||||
|
else
|
||||||
|
rcu_read_delay(rrsp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void srcu_torture_read_unlock(int idx) __releases(&srcu_ctl)
|
static void srcu_torture_read_unlock(int idx) __releases(&srcu_ctl)
|
||||||
|
|
Loading…
Reference in a new issue