rcutorture: Verify RCU reader prevents full polling from completing
authorPaul E. McKenney <paulmck@kernel.org>
Tue, 2 Aug 2022 00:33:24 +0000 (17:33 -0700)
committerPaul E. McKenney <paulmck@kernel.org>
Wed, 31 Aug 2022 12:08:07 +0000 (05:08 -0700)
This commit adds a test to rcu_torture_writer() that verifies that a
->get_gp_state_full() and ->poll_gp_state_full() polled grace-period
sequence does not claim that a grace period elapsed within the confines
of the corresponding read-side critical section.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
kernel/rcu/rcutorture.c

index f2564c7633a8a3e690bf11c84f2a8a73b6500f72..050f4d0a987ffe10b6f7b3011bf9199b40031d5e 100644 (file)
@@ -1309,6 +1309,8 @@ rcu_torture_writer(void *arg)
                        atomic_inc(&rcu_torture_wcount[i]);
                        WRITE_ONCE(old_rp->rtort_pipe_count,
                                   old_rp->rtort_pipe_count + 1);
+
+                       // Make sure readers block polled grace periods.
                        if (cur_ops->get_gp_state && cur_ops->poll_gp_state) {
                                idx = cur_ops->readlock();
                                cookie = cur_ops->get_gp_state();
@@ -1325,9 +1327,20 @@ rcu_torture_writer(void *arg)
                                }
                                cur_ops->readunlock(idx);
                        }
-                       if (cur_ops->get_gp_completed_full && cur_ops->poll_gp_state_full) {
-                               cur_ops->get_gp_completed_full(&cookie_full);
-                               WARN_ON_ONCE(!cur_ops->poll_gp_state_full(&cookie_full));
+                       if (cur_ops->get_gp_state_full && cur_ops->poll_gp_state_full) {
+                               idx = cur_ops->readlock();
+                               cur_ops->get_gp_state_full(&cookie_full);
+                               WARN_ONCE(cur_ops->poll_gp_state_full(&cookie_full),
+                                         "%s: Cookie check 5 failed %s(%d) online %*pbl\n",
+                                         __func__,
+                                         rcu_torture_writer_state_getname(),
+                                         rcu_torture_writer_state,
+                                         cpumask_pr_args(cpu_online_mask));
+                               if (cur_ops->get_gp_completed_full) {
+                                       cur_ops->get_gp_completed_full(&cookie_full);
+                                       WARN_ON_ONCE(!cur_ops->poll_gp_state_full(&cookie_full));
+                               }
+                               cur_ops->readunlock(idx);
                        }
                        switch (synctype[torture_random(&rand) % nsynctypes]) {
                        case RTWS_DEF_FREE: