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

rcutorture: Check GP completion at stutter end



The rcu_torture_writer() function invokes stutter_wait() at the end of
each writer pass, which occasionally blocks for an extended time period
in order to ensure that RCU can handle intermittent loads.  But part of
handling a busy period is invoking all the callbacks before the end of
the idle period induced by stutter_wait().

This commit therefore adds a return value to stutter_wait() indicating
whether stutter_wait() actually waited.  In addition, this commit causes
rcu_torture_writer() to test this value and if set, checks that all the
elements of the rcu_tortures[] array have been freed up.

Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
parent f4de46ed
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -77,7 +77,7 @@ void torture_shutdown_absorb(const char *title);
int torture_shutdown_init(int ssecs, void (*cleanup)(void));

/* Task stuttering, which forces load/no-load transitions. */
void stutter_wait(const char *title);
bool stutter_wait(const char *title);
int torture_stutter_init(int s);

/* Initialization and cleanup. */
+4 −1
Original line number Diff line number Diff line
@@ -1144,7 +1144,10 @@ rcu_torture_writer(void *arg)
				       !rcu_gp_is_normal();
		}
		rcu_torture_writer_state = RTWS_STUTTER;
		stutter_wait("rcu_torture_writer");
		if (stutter_wait("rcu_torture_writer"))
			for (i = 0; i < ARRAY_SIZE(rcu_tortures); i++)
				if (list_empty(&rcu_tortures[i].rtort_free))
					WARN_ON_ONCE(1);
	} while (!torture_must_stop());
	/* Reset expediting back to unexpedited. */
	if (expediting > 0)
+2 −1
Original line number Diff line number Diff line
@@ -573,7 +573,7 @@ static int stutter;
 * Block until the stutter interval ends.  This must be called periodically
 * by all running kthreads that need to be subject to stuttering.
 */
void stutter_wait(const char *title)
bool stutter_wait(const char *title)
{
	int spt;

@@ -590,6 +590,7 @@ void stutter_wait(const char *title)
		}
		torture_shutdown_absorb(title);
	}
	return !!spt;
}
EXPORT_SYMBOL_GPL(stutter_wait);