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

rcutorture: Limit read-side polling-API testing



RCU's polled grace-period API is reasonably lightweight, but still
contains heavyweight memory barriers.  This commit therefore limits
testing of this API from rcutorture's readers in order to avoid the
false negatives that these heavyweight operations could provoke.

Signed-off-by: default avatarPaul E. McKenney <paulmck@kernel.org>
parent 18538248
Loading
Loading
Loading
Loading
+23 −18
Original line number Original line Diff line number Diff line
@@ -1903,6 +1903,7 @@ rcutorture_loop_extend(int *readstate, struct torture_random_state *trsp,
 */
 */
static bool rcu_torture_one_read(struct torture_random_state *trsp, long myid)
static bool rcu_torture_one_read(struct torture_random_state *trsp, long myid)
{
{
	bool checkpolling = !(torture_random(trsp) & 0xfff);
	unsigned long cookie;
	unsigned long cookie;
	struct rcu_gp_oldstate cookie_full;
	struct rcu_gp_oldstate cookie_full;
	int i;
	int i;
@@ -1920,10 +1921,12 @@ static bool rcu_torture_one_read(struct torture_random_state *trsp, long myid)
	WARN_ON_ONCE(!rcu_is_watching());
	WARN_ON_ONCE(!rcu_is_watching());
	newstate = rcutorture_extend_mask(readstate, trsp);
	newstate = rcutorture_extend_mask(readstate, trsp);
	rcutorture_one_extend(&readstate, newstate, trsp, rtrsp++);
	rcutorture_one_extend(&readstate, newstate, trsp, rtrsp++);
	if (checkpolling) {
		if (cur_ops->get_gp_state && cur_ops->poll_gp_state)
		if (cur_ops->get_gp_state && cur_ops->poll_gp_state)
			cookie = cur_ops->get_gp_state();
			cookie = cur_ops->get_gp_state();
		if (cur_ops->get_gp_state_full && cur_ops->poll_gp_state_full)
		if (cur_ops->get_gp_state_full && cur_ops->poll_gp_state_full)
			cur_ops->get_gp_state_full(&cookie_full);
			cur_ops->get_gp_state_full(&cookie_full);
	}
	started = cur_ops->get_gp_seq();
	started = cur_ops->get_gp_seq();
	ts = rcu_trace_clock_local();
	ts = rcu_trace_clock_local();
	p = rcu_dereference_check(rcu_torture_current,
	p = rcu_dereference_check(rcu_torture_current,
@@ -1957,6 +1960,7 @@ static bool rcu_torture_one_read(struct torture_random_state *trsp, long myid)
	}
	}
	__this_cpu_inc(rcu_torture_batch[completed]);
	__this_cpu_inc(rcu_torture_batch[completed]);
	preempt_enable();
	preempt_enable();
	if (checkpolling) {
		if (cur_ops->get_gp_state && cur_ops->poll_gp_state)
		if (cur_ops->get_gp_state && cur_ops->poll_gp_state)
			WARN_ONCE(cur_ops->poll_gp_state(cookie),
			WARN_ONCE(cur_ops->poll_gp_state(cookie),
				  "%s: Cookie check 2 failed %s(%d) %lu->%lu\n",
				  "%s: Cookie check 2 failed %s(%d) %lu->%lu\n",
@@ -1971,6 +1975,7 @@ static bool rcu_torture_one_read(struct torture_random_state *trsp, long myid)
				  rcu_torture_writer_state_getname(),
				  rcu_torture_writer_state_getname(),
				  rcu_torture_writer_state,
				  rcu_torture_writer_state,
				  cpumask_pr_args(cpu_online_mask));
				  cpumask_pr_args(cpu_online_mask));
	}
	rcutorture_one_extend(&readstate, 0, trsp, rtrsp);
	rcutorture_one_extend(&readstate, 0, trsp, rtrsp);
	WARN_ON_ONCE(readstate);
	WARN_ON_ONCE(readstate);
	// This next splat is expected behavior if leakpointer, especially
	// This next splat is expected behavior if leakpointer, especially