Skip to content

Commit

Permalink
torture: Check for multiple concurrent torture tests
Browse files Browse the repository at this point in the history
The torture tests are designed to run in isolation, but do not enforce
this isolation.  This commit therefore checks for concurrent torture
tests, and refuses to start new tests while old tests are running.

Signed-off-by: Paul E. McKenney <[email protected]>
Reviewed-by: Josh Triplett <[email protected]>
  • Loading branch information
paulmck committed May 14, 2014
1 parent d065eac commit 5228084
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 5 deletions.
2 changes: 1 addition & 1 deletion include/linux/torture.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ void stutter_wait(const char *title);
int torture_stutter_init(int s);

/* Initialization and cleanup. */
void torture_init_begin(char *ttype, bool v, int *runnable);
bool torture_init_begin(char *ttype, bool v, int *runnable);
void torture_init_end(void);
bool torture_cleanup(void);
bool torture_must_stop(void);
Expand Down
3 changes: 2 additions & 1 deletion kernel/locking/locktorture.c
Original file line number Diff line number Diff line change
Expand Up @@ -355,7 +355,8 @@ static int __init lock_torture_init(void)
&lock_busted_ops, &spin_lock_ops, &spin_lock_irq_ops,
};

torture_init_begin(torture_type, verbose, &locktorture_runnable);
if (!torture_init_begin(torture_type, verbose, &locktorture_runnable))
return -EBUSY;

/* Process args and tell the world that the torturer is on the job. */
for (i = 0; i < ARRAY_SIZE(torture_ops); i++) {
Expand Down
3 changes: 2 additions & 1 deletion kernel/rcu/rcutorture.c
Original file line number Diff line number Diff line change
Expand Up @@ -1536,7 +1536,8 @@ rcu_torture_init(void)
&rcu_ops, &rcu_bh_ops, &rcu_busted_ops, &srcu_ops, &sched_ops,
};

torture_init_begin(torture_type, verbose, &rcutorture_runnable);
if (!torture_init_begin(torture_type, verbose, &rcutorture_runnable))
return -EBUSY;

/* Process args and tell the world that the torturer is on the job. */
for (i = 0; i < ARRAY_SIZE(torture_ops); i++) {
Expand Down
13 changes: 11 additions & 2 deletions kernel/torture.c
Original file line number Diff line number Diff line change
Expand Up @@ -599,14 +599,20 @@ static void torture_stutter_cleanup(void)
* The runnable parameter points to a flag that controls whether or not
* the test is currently runnable. If there is no such flag, pass in NULL.
*/
void __init torture_init_begin(char *ttype, bool v, int *runnable)
bool __init torture_init_begin(char *ttype, bool v, int *runnable)
{
mutex_lock(&fullstop_mutex);
if (torture_type != NULL) {
pr_alert("torture_init_begin: refusing %s init: %s running",
ttype, torture_type);
mutex_unlock(&fullstop_mutex);
return false;
}
torture_type = ttype;
verbose = v;
torture_runnable = runnable;
fullstop = FULLSTOP_DONTSTOP;

return true;
}
EXPORT_SYMBOL_GPL(torture_init_begin);

Expand Down Expand Up @@ -645,6 +651,9 @@ bool torture_cleanup(void)
torture_shuffle_cleanup();
torture_stutter_cleanup();
torture_onoff_cleanup();
mutex_lock(&fullstop_mutex);
torture_type = NULL;
mutex_unlock(&fullstop_mutex);
return false;
}
EXPORT_SYMBOL_GPL(torture_cleanup);
Expand Down

0 comments on commit 5228084

Please sign in to comment.