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

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

rcutorture: Abstract torture-test initialization



This commit creates torture_init_begin() and torture_init_end() functions
to abstract locking and allow the torture_type and verbose variables
in kernel/torture.o to become static.  With a bit more abstraction,
fullstop_mutex will also become static.

Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Reviewed-by: default avatarJosh Triplett <josh@joshtriplett.org>
parent 2e9e8081
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -49,10 +49,6 @@ extern int fullstop;
/* Protect fullstop transitions and spawning of kthreads.  */
extern struct mutex fullstop_mutex;

/* Common module parameters. */
extern char *torture_type;
extern bool verbose;

#define TORTURE_FLAG "-torture:"
#define TOROUT_STRING(s) \
	pr_alert("%s" TORTURE_FLAG s "\n", torture_type)
@@ -89,4 +85,9 @@ 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);

#endif /* __LINUX_TORTURE_H */
+8 −11
Original line number Diff line number Diff line
@@ -91,15 +91,12 @@ torture_param(int, test_boost_interval, 7,
	     "Interval between boost tests, seconds.");
torture_param(bool, test_no_idle_hz, true,
	     "Test support for tickless idle CPUs");
torture_param(bool, verbose, true,
	     "Enable verbose debugging printk()s");

char *torture_type = "rcu";
EXPORT_SYMBOL_GPL(torture_type);
static char *torture_type = "rcu";
module_param(torture_type, charp, 0444);
MODULE_PARM_DESC(torture_type, "Type of RCU to torture (rcu, rcu_bh, ...)");
bool verbose;
EXPORT_SYMBOL_GPL(verbose);
module_param(verbose, bool, 0444);
MODULE_PARM_DESC(verbose, "Enable verbose debugging printk()s");

static int nrealreaders;
static struct task_struct *writer_task;
@@ -1425,8 +1422,8 @@ rcu_torture_cleanup(void)
{
	int i;

	mutex_lock(&fullstop_mutex);
	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");
@@ -1589,7 +1586,7 @@ rcu_torture_init(void)
		&rcu_ops, &rcu_bh_ops, &srcu_ops, &sched_ops,
	};

	mutex_lock(&fullstop_mutex);
	torture_init_begin(torture_type, verbose);

	/* Process args and tell the world that the torturer is on the job. */
	for (i = 0; i < ARRAY_SIZE(torture_ops); i++) {
@@ -1604,7 +1601,7 @@ rcu_torture_init(void)
		for (i = 0; i < ARRAY_SIZE(torture_ops); i++)
			pr_alert(" %s", torture_ops[i]->name);
		pr_alert("\n");
		mutex_unlock(&fullstop_mutex);
		torture_init_end();
		return -EINVAL;
	}
	if (cur_ops->fqs == NULL && fqs_duration != 0) {
@@ -1800,11 +1797,11 @@ rcu_torture_init(void)
	if (object_debug)
		rcu_test_debug_objects();
	rcutorture_record_test_transition();
	mutex_unlock(&fullstop_mutex);
	torture_init_end();
	return 0;

unwind:
	mutex_unlock(&fullstop_mutex);
	torture_init_end();
	rcu_torture_cleanup();
	return firsterr;
}
+27 −0
Original line number Diff line number Diff line
@@ -49,6 +49,9 @@
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Paul E. McKenney <paulmck@us.ibm.com>");

static char *torture_type;
static bool verbose;

int fullstop = FULLSTOP_RMMOD;
EXPORT_SYMBOL_GPL(fullstop);
DEFINE_MUTEX(fullstop_mutex);
@@ -426,3 +429,27 @@ void torture_shutdown_absorb(const char *title)
	}
}
EXPORT_SYMBOL_GPL(torture_shutdown_absorb);

/*
 * Initialize torture module.  Please note that this is -not- invoked via
 * the usual module_init() mechanism, but rather by an explicit call from
 * the client torture module.  This call must be paired with a later
 * torture_init_end().
 */
void __init torture_init_begin(char *ttype, bool v)
{
	mutex_lock(&fullstop_mutex);
	torture_type = ttype;
	verbose = v;

}
EXPORT_SYMBOL_GPL(torture_init_begin);

/*
 * Tell the torture module that initialization is complete.
 */
void __init torture_init_end(void)
{
	mutex_unlock(&fullstop_mutex);
}
EXPORT_SYMBOL_GPL(torture_init_end);