rcutorture: Emphasize testing of single reader protection type
For RCU implementations supporting multiple types of reader protection, rcutorture currently randomly selects the combinations of types of protection for each phase of each reader. The problem with this, for example, given the four kinds of protection for RCU-sched (local_irq_disable(), local_bh_disable(), preempt_disable(), and rcu_read_lock_sched()), the reader will be protected by a single mechanism only 25% of the time. We really heavier testing of single read-side mechanisms. This commit therefore uses only a single mechanism about 60% of the time, half of the time explicitly and one-eighth of the time by chance. Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
This commit is contained in:
parent
2397d072f7
commit
bf1bef50be
|
@ -69,6 +69,7 @@ MODULE_AUTHOR("Paul E. McKenney <paulmck@us.ibm.com> and Josh Triplett <josh@jos
|
||||||
#define RCUTORTURE_RDR_IRQ 0x2 /* ... disabling interrupts. */
|
#define RCUTORTURE_RDR_IRQ 0x2 /* ... disabling interrupts. */
|
||||||
#define RCUTORTURE_RDR_PREEMPT 0x4 /* ... disabling preemption. */
|
#define RCUTORTURE_RDR_PREEMPT 0x4 /* ... disabling preemption. */
|
||||||
#define RCUTORTURE_RDR_RCU 0x8 /* ... entering another RCU reader. */
|
#define RCUTORTURE_RDR_RCU 0x8 /* ... entering another RCU reader. */
|
||||||
|
#define RCUTORTURE_RDR_NBITS 4 /* Number of bits defined above. */
|
||||||
#define RCUTORTURE_MAX_EXTEND (RCUTORTURE_RDR_BH | RCUTORTURE_RDR_IRQ | \
|
#define RCUTORTURE_MAX_EXTEND (RCUTORTURE_RDR_BH | RCUTORTURE_RDR_IRQ | \
|
||||||
RCUTORTURE_RDR_PREEMPT)
|
RCUTORTURE_RDR_PREEMPT)
|
||||||
#define RCUTORTURE_RDR_MAX_LOOPS 0x7 /* Maximum reader extensions. */
|
#define RCUTORTURE_RDR_MAX_LOOPS 0x7 /* Maximum reader extensions. */
|
||||||
|
@ -1198,9 +1199,15 @@ static int
|
||||||
rcutorture_extend_mask(int oldmask, struct torture_random_state *trsp)
|
rcutorture_extend_mask(int oldmask, struct torture_random_state *trsp)
|
||||||
{
|
{
|
||||||
int mask = rcutorture_extend_mask_max();
|
int mask = rcutorture_extend_mask_max();
|
||||||
|
unsigned long randmask1 = torture_random(trsp) >> 8;
|
||||||
|
unsigned long randmask2 = randmask1 >> 1;
|
||||||
|
|
||||||
WARN_ON_ONCE(mask >> RCUTORTURE_RDR_SHIFT);
|
WARN_ON_ONCE(mask >> RCUTORTURE_RDR_SHIFT);
|
||||||
mask = mask & (torture_random(trsp) >> RCUTORTURE_RDR_SHIFT);
|
/* Half the time lots of bits, half the time only one bit. */
|
||||||
|
if (randmask1 & 0x1)
|
||||||
|
mask = mask & randmask2;
|
||||||
|
else
|
||||||
|
mask = mask & (1 << (randmask2 % RCUTORTURE_RDR_NBITS));
|
||||||
if ((mask & RCUTORTURE_RDR_IRQ) &&
|
if ((mask & RCUTORTURE_RDR_IRQ) &&
|
||||||
!(mask & RCUTORTURE_RDR_BH) &&
|
!(mask & RCUTORTURE_RDR_BH) &&
|
||||||
(oldmask & RCUTORTURE_RDR_BH))
|
(oldmask & RCUTORTURE_RDR_BH))
|
||||||
|
|
Loading…
Reference in New Issue