This commit prepares for testing of multiple SRCU reader flavors by
expanding RCUTORTURE_RDR_MASK_1 and RCUTORTURE_RDR_MASK_2 from a single
bit to eight bits, allowing them to accommodate the return values from
multiple calls to srcu_read_lock*().  This will in turn permit better
testing coverage for these SRCU reader flavors, including testing of
the diagnostics for inproper use of mixed reader flavors.

Signed-off-by: Paul E. McKenney <paul...@kernel.org>
Cc: Alexei Starovoitov <a...@kernel.org>
Cc: Andrii Nakryiko <and...@kernel.org>
Cc: Peter Zijlstra <pet...@infradead.org>
Cc: Kent Overstreet <kent.overstr...@linux.dev>
Cc: <b...@vger.kernel.org>
---
 kernel/rcu/rcutorture.c | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index 3ac8c69dd5bc9..ea71a23b45d8b 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -57,9 +57,9 @@ MODULE_AUTHOR("Paul E. McKenney <paul...@linux.ibm.com> and 
Josh Triplett <josh@
 
 /* Bits for ->extendables field, extendables param, and related definitions. */
 #define RCUTORTURE_RDR_SHIFT_1  8      /* Put SRCU index in upper bits. */
-#define RCUTORTURE_RDR_MASK_1   (1 << RCUTORTURE_RDR_SHIFT_1)
-#define RCUTORTURE_RDR_SHIFT_2  9      /* Put SRCU index in upper bits. */
-#define RCUTORTURE_RDR_MASK_2   (1 << RCUTORTURE_RDR_SHIFT_2)
+#define RCUTORTURE_RDR_MASK_1   (0xff << RCUTORTURE_RDR_SHIFT_1)
+#define RCUTORTURE_RDR_SHIFT_2  16     /* Put SRCU index in upper bits. */
+#define RCUTORTURE_RDR_MASK_2   (0xff << RCUTORTURE_RDR_SHIFT_2)
 #define RCUTORTURE_RDR_BH       0x01   /* Extend readers by disabling bh. */
 #define RCUTORTURE_RDR_IRQ      0x02   /*  ... disabling interrupts. */
 #define RCUTORTURE_RDR_PREEMPT  0x04   /*  ... disabling preemption. */
@@ -71,6 +71,9 @@ MODULE_AUTHOR("Paul E. McKenney <paul...@linux.ibm.com> and 
Josh Triplett <josh@
 #define RCUTORTURE_MAX_EXTEND   \
        (RCUTORTURE_RDR_BH | RCUTORTURE_RDR_IRQ | RCUTORTURE_RDR_PREEMPT | \
         RCUTORTURE_RDR_RBH | RCUTORTURE_RDR_SCHED)
+#define RCUTORTURE_RDR_ALLBITS \
+       (RCUTORTURE_MAX_EXTEND | RCUTORTURE_RDR_RCU_1 | RCUTORTURE_RDR_RCU_2 | \
+        RCUTORTURE_RDR_MASK_1 | RCUTORTURE_RDR_MASK_2)
 #define RCUTORTURE_RDR_MAX_LOOPS 0x7   /* Maximum reader extensions. */
                                        /* Must be power of two minus one. */
 #define RCUTORTURE_RDR_MAX_SEGS (RCUTORTURE_RDR_MAX_LOOPS + 3)
@@ -1835,7 +1838,7 @@ static void rcutorture_one_extend(int *readstate, int 
newstate,
        int statesold = *readstate & ~newstate;
 
        WARN_ON_ONCE(idxold2 < 0);
-       WARN_ON_ONCE((idxold2 >> RCUTORTURE_RDR_SHIFT_2) > 1);
+       WARN_ON_ONCE(idxold2 & ~RCUTORTURE_RDR_ALLBITS);
        rtrsp->rt_readstate = newstate;
 
        /* First, put new protection in place to avoid critical-section gap. */
@@ -1850,9 +1853,9 @@ static void rcutorture_one_extend(int *readstate, int 
newstate,
        if (statesnew & RCUTORTURE_RDR_SCHED)
                rcu_read_lock_sched();
        if (statesnew & RCUTORTURE_RDR_RCU_1)
-               idxnew1 = (cur_ops->readlock() & 0x1) << RCUTORTURE_RDR_SHIFT_1;
+               idxnew1 = (cur_ops->readlock() << RCUTORTURE_RDR_SHIFT_1) & 
RCUTORTURE_RDR_MASK_1;
        if (statesnew & RCUTORTURE_RDR_RCU_2)
-               idxnew2 = (cur_ops->readlock() & 0x1) << RCUTORTURE_RDR_SHIFT_2;
+               idxnew2 = (cur_ops->readlock() << RCUTORTURE_RDR_SHIFT_2) & 
RCUTORTURE_RDR_MASK_2;
 
        /*
         * Next, remove old protection, in decreasing order of strength
@@ -1872,7 +1875,7 @@ static void rcutorture_one_extend(int *readstate, int 
newstate,
        if (statesold & RCUTORTURE_RDR_RBH)
                rcu_read_unlock_bh();
        if (statesold & RCUTORTURE_RDR_RCU_2) {
-               cur_ops->readunlock((idxold2 >> RCUTORTURE_RDR_SHIFT_2) & 0x1);
+               cur_ops->readunlock((idxold2 & RCUTORTURE_RDR_MASK_2) >> 
RCUTORTURE_RDR_SHIFT_2);
                WARN_ON_ONCE(idxnew2 != -1);
                idxold2 = 0;
        }
@@ -1882,7 +1885,7 @@ static void rcutorture_one_extend(int *readstate, int 
newstate,
                lockit = !cur_ops->no_pi_lock && !statesnew && 
!(torture_random(trsp) & 0xffff);
                if (lockit)
                        raw_spin_lock_irqsave(&current->pi_lock, flags);
-               cur_ops->readunlock((idxold1 >> RCUTORTURE_RDR_SHIFT_1) & 0x1);
+               cur_ops->readunlock((idxold1 & RCUTORTURE_RDR_MASK_1) >> 
RCUTORTURE_RDR_SHIFT_1);
                WARN_ON_ONCE(idxnew1 != -1);
                idxold1 = 0;
                if (lockit)
@@ -1897,16 +1900,13 @@ static void rcutorture_one_extend(int *readstate, int 
newstate,
        if (idxnew1 == -1)
                idxnew1 = idxold1 & RCUTORTURE_RDR_MASK_1;
        WARN_ON_ONCE(idxnew1 < 0);
-       if (WARN_ON_ONCE((idxnew1 >> RCUTORTURE_RDR_SHIFT_1) > 1))
-               pr_info("Unexpected idxnew1 value of %#x\n", idxnew1);
        if (idxnew2 == -1)
                idxnew2 = idxold2 & RCUTORTURE_RDR_MASK_2;
        WARN_ON_ONCE(idxnew2 < 0);
-       WARN_ON_ONCE((idxnew2 >> RCUTORTURE_RDR_SHIFT_2) > 1);
        *readstate = idxnew1 | idxnew2 | newstate;
        WARN_ON_ONCE(*readstate < 0);
-       if (WARN_ON_ONCE((*readstate >> RCUTORTURE_RDR_SHIFT_2) > 1))
-               pr_info("Unexpected idxnew2 value of %#x\n", idxnew2);
+       if (WARN_ON_ONCE(*readstate & ~RCUTORTURE_RDR_ALLBITS))
+               pr_info("Unexpected readstate value of %#x\n", *readstate);
 }
 
 /* Return the biggest extendables mask given current RCU and boot parameters. 
*/
@@ -1931,7 +1931,7 @@ rcutorture_extend_mask(int oldmask, struct 
torture_random_state *trsp)
        unsigned long preempts_irq = preempts | RCUTORTURE_RDR_IRQ;
        unsigned long bhs = RCUTORTURE_RDR_BH | RCUTORTURE_RDR_RBH;
 
-       WARN_ON_ONCE(mask >> RCUTORTURE_RDR_SHIFT_1);
+       WARN_ON_ONCE(mask >> RCUTORTURE_RDR_SHIFT_1);  // Can't have reader idx 
bits.
        /* Mostly only one bit (need preemption!), sometimes lots of bits. */
        if (!(randmask1 & 0x7))
                mask = mask & randmask2;
-- 
2.40.1


Reply via email to