Commit d594231a authored by Paul E. McKenney's avatar Paul E. McKenney
Browse files

rcutorture: Verify RCU reader prevents full polling from completing



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: default avatarPaul E. McKenney <paulmck@kernel.org>
parent ed7d2f1a
Loading
Loading
Loading
Loading
+16 −3
Original line number Diff line number Diff line
@@ -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,10 +1327,21 @@ rcu_torture_writer(void *arg)
				}
				cur_ops->readunlock(idx);
			}
			if (cur_ops->get_gp_completed_full && cur_ops->poll_gp_state_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:
				rcu_torture_writer_state = RTWS_DEF_FREE;