Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

rcutorture: Abstract torture-test cleanup



This commit creates a torture_cleanup() that handles the generic
cleanup actions local to kernel/torture.c.

Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Reviewed-by: default avatarJosh Triplett <josh@joshtriplett.org>
parent b5daa8f3
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -65,7 +65,6 @@ extern struct mutex fullstop_mutex;

/* Definitions for online/offline exerciser. */
int torture_onoff_init(long ooholdoff, long oointerval);
void torture_onoff_cleanup(void);
char *torture_onoff_stats(char *page);
bool torture_onoff_failures(void);

@@ -80,14 +79,13 @@ unsigned long torture_random(struct torture_random_state *trsp);
/* Task shuffler, which causes CPUs to occasionally go idle. */
void torture_shuffle_task_register(struct task_struct *tp);
int torture_shuffle_init(long shuffint);
void torture_shuffle_cleanup(void);

/* Shutdown task absorption, for when the tasks cannot safely be killed. */
void torture_shutdown_absorb(const char *title);

/* Initialization and cleanup. */

void torture_init_begin(char *ttype, bool v);
void torture_init_end(void);
bool torture_cleanup(void);

#endif /* __LINUX_TORTURE_H */
+1 −10
Original line number Diff line number Diff line
@@ -1423,21 +1423,13 @@ rcu_torture_cleanup(void)
	int i;

	rcutorture_record_test_transition();
	mutex_lock(&fullstop_mutex);
	if (fullstop == FULLSTOP_SHUTDOWN) {
		pr_warn(/* but going down anyway, so... */
		       "Concurrent 'rmmod rcutorture' and shutdown illegal!\n");
		mutex_unlock(&fullstop_mutex);
		schedule_timeout_uninterruptible(10);
	if (torture_cleanup()) {
		if (cur_ops->cb_barrier != NULL)
			cur_ops->cb_barrier();
		return;
	}
	fullstop = FULLSTOP_RMMOD;
	mutex_unlock(&fullstop_mutex);
	unregister_reboot_notifier(&rcutorture_shutdown_nb);

	torture_shuffle_cleanup(); /* Must be first task cleaned up. */
	rcu_torture_barrier_cleanup();
	rcu_torture_stall_cleanup();
	if (stutter_task) {
@@ -1501,7 +1493,6 @@ rcu_torture_cleanup(void)
		kthread_stop(shutdown_task);
	}
	shutdown_task = NULL;
	torture_onoff_cleanup();

	/* Wait for all RCU callbacks to fire.  */

+28 −2
Original line number Diff line number Diff line
@@ -199,7 +199,7 @@ EXPORT_SYMBOL_GPL(torture_onoff_init);
/*
 * Clean up after online/offline testing.
 */
void torture_onoff_cleanup(void)
static void torture_onoff_cleanup(void)
{
#ifdef CONFIG_HOTPLUG_CPU
	if (onoff_task == NULL)
@@ -403,7 +403,7 @@ EXPORT_SYMBOL_GPL(torture_shuffle_init);
/*
 * Stop the shuffling.
 */
void torture_shuffle_cleanup(void)
static void torture_shuffle_cleanup(void)
{
	torture_shuffle_task_unregister_all();
	if (shuffler_task) {
@@ -453,3 +453,29 @@ void __init torture_init_end(void)
	mutex_unlock(&fullstop_mutex);
}
EXPORT_SYMBOL_GPL(torture_init_end);

/*
 * Clean up torture module.  Please note that this is -not- invoked via
 * the usual module_exit() mechanism, but rather by an explicit call from
 * the client torture module.  Returns true if a race with system shutdown
 * is detected.
 *
 * This must be called before the caller starts shutting down its own
 * kthreads.
 */
bool torture_cleanup(void)
{
	mutex_lock(&fullstop_mutex);
	if (fullstop == FULLSTOP_SHUTDOWN) {
		pr_warn("Concurrent rmmod and shutdown illegal!\n");
		mutex_unlock(&fullstop_mutex);
		schedule_timeout_uninterruptible(10);
		return true;
	}
	fullstop = FULLSTOP_RMMOD;
	mutex_unlock(&fullstop_mutex);
	torture_shuffle_cleanup();
	torture_onoff_cleanup();
	return false;
}
EXPORT_SYMBOL_GPL(torture_cleanup);