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

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
...@@ -49,10 +49,6 @@ extern int fullstop; ...@@ -49,10 +49,6 @@ extern int fullstop;
/* Protect fullstop transitions and spawning of kthreads. */ /* Protect fullstop transitions and spawning of kthreads. */
extern struct mutex fullstop_mutex; extern struct mutex fullstop_mutex;
/* Common module parameters. */
extern char *torture_type;
extern bool verbose;
#define TORTURE_FLAG "-torture:" #define TORTURE_FLAG "-torture:"
#define TOROUT_STRING(s) \ #define TOROUT_STRING(s) \
pr_alert("%s" TORTURE_FLAG s "\n", torture_type) pr_alert("%s" TORTURE_FLAG s "\n", torture_type)
...@@ -89,4 +85,9 @@ void torture_shuffle_cleanup(void); ...@@ -89,4 +85,9 @@ void torture_shuffle_cleanup(void);
/* Shutdown task absorption, for when the tasks cannot safely be killed. */ /* Shutdown task absorption, for when the tasks cannot safely be killed. */
void torture_shutdown_absorb(const char *title); 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 */ #endif /* __LINUX_TORTURE_H */
...@@ -91,15 +91,12 @@ torture_param(int, test_boost_interval, 7, ...@@ -91,15 +91,12 @@ torture_param(int, test_boost_interval, 7,
"Interval between boost tests, seconds."); "Interval between boost tests, seconds.");
torture_param(bool, test_no_idle_hz, true, torture_param(bool, test_no_idle_hz, true,
"Test support for tickless idle CPUs"); "Test support for tickless idle CPUs");
torture_param(bool, verbose, true,
"Enable verbose debugging printk()s");
char *torture_type = "rcu"; static char *torture_type = "rcu";
EXPORT_SYMBOL_GPL(torture_type);
module_param(torture_type, charp, 0444); module_param(torture_type, charp, 0444);
MODULE_PARM_DESC(torture_type, "Type of RCU to torture (rcu, rcu_bh, ...)"); 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 int nrealreaders;
static struct task_struct *writer_task; static struct task_struct *writer_task;
...@@ -1425,8 +1422,8 @@ rcu_torture_cleanup(void) ...@@ -1425,8 +1422,8 @@ rcu_torture_cleanup(void)
{ {
int i; int i;
mutex_lock(&fullstop_mutex);
rcutorture_record_test_transition(); rcutorture_record_test_transition();
mutex_lock(&fullstop_mutex);
if (fullstop == FULLSTOP_SHUTDOWN) { if (fullstop == FULLSTOP_SHUTDOWN) {
pr_warn(/* but going down anyway, so... */ pr_warn(/* but going down anyway, so... */
"Concurrent 'rmmod rcutorture' and shutdown illegal!\n"); "Concurrent 'rmmod rcutorture' and shutdown illegal!\n");
...@@ -1589,7 +1586,7 @@ rcu_torture_init(void) ...@@ -1589,7 +1586,7 @@ rcu_torture_init(void)
&rcu_ops, &rcu_bh_ops, &srcu_ops, &sched_ops, &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. */ /* Process args and tell the world that the torturer is on the job. */
for (i = 0; i < ARRAY_SIZE(torture_ops); i++) { for (i = 0; i < ARRAY_SIZE(torture_ops); i++) {
...@@ -1604,7 +1601,7 @@ rcu_torture_init(void) ...@@ -1604,7 +1601,7 @@ rcu_torture_init(void)
for (i = 0; i < ARRAY_SIZE(torture_ops); i++) for (i = 0; i < ARRAY_SIZE(torture_ops); i++)
pr_alert(" %s", torture_ops[i]->name); pr_alert(" %s", torture_ops[i]->name);
pr_alert("\n"); pr_alert("\n");
mutex_unlock(&fullstop_mutex); torture_init_end();
return -EINVAL; return -EINVAL;
} }
if (cur_ops->fqs == NULL && fqs_duration != 0) { if (cur_ops->fqs == NULL && fqs_duration != 0) {
...@@ -1800,11 +1797,11 @@ rcu_torture_init(void) ...@@ -1800,11 +1797,11 @@ rcu_torture_init(void)
if (object_debug) if (object_debug)
rcu_test_debug_objects(); rcu_test_debug_objects();
rcutorture_record_test_transition(); rcutorture_record_test_transition();
mutex_unlock(&fullstop_mutex); torture_init_end();
return 0; return 0;
unwind: unwind:
mutex_unlock(&fullstop_mutex); torture_init_end();
rcu_torture_cleanup(); rcu_torture_cleanup();
return firsterr; return firsterr;
} }
......
...@@ -49,6 +49,9 @@ ...@@ -49,6 +49,9 @@
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_AUTHOR("Paul E. McKenney <paulmck@us.ibm.com>"); MODULE_AUTHOR("Paul E. McKenney <paulmck@us.ibm.com>");
static char *torture_type;
static bool verbose;
int fullstop = FULLSTOP_RMMOD; int fullstop = FULLSTOP_RMMOD;
EXPORT_SYMBOL_GPL(fullstop); EXPORT_SYMBOL_GPL(fullstop);
DEFINE_MUTEX(fullstop_mutex); DEFINE_MUTEX(fullstop_mutex);
...@@ -426,3 +429,27 @@ void torture_shutdown_absorb(const char *title) ...@@ -426,3 +429,27 @@ void torture_shutdown_absorb(const char *title)
} }
} }
EXPORT_SYMBOL_GPL(torture_shutdown_absorb); 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);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment