mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
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: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Reviewed-by: Josh Triplett <josh@joshtriplett.org>
This commit is contained in:
parent
2e9e8081d2
commit
b5daa8f3b3
3 changed files with 40 additions and 15 deletions
|
@ -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);
|
||||||
/* 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,
|
||||||
"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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
&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)
|
||||||
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)
|
||||||
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 @@
|
||||||
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue