Skip to content

Commit

Permalink
rcutorture: Apply ACCESS_ONCE() to racy fullstop accesses
Browse files Browse the repository at this point in the history
Because the fullstop variable can be accessed while it is being updated,
this commit avoids any resulting compiler mischief through use of
ACCESS_ONCE() for non-initialization accesses to this shared variable.

Signed-off-by: Paul E. McKenney <[email protected]>
Reviewed-by: Josh Triplett <[email protected]>
  • Loading branch information
paulmck committed Feb 23, 2014
1 parent 628edaa commit 57a2fe9
Showing 1 changed file with 5 additions and 5 deletions.
10 changes: 5 additions & 5 deletions kernel/torture.c
Original file line number Diff line number Diff line change
Expand Up @@ -439,9 +439,9 @@ static int torture_shutdown_notify(struct notifier_block *unused1,
unsigned long unused2, void *unused3)
{
mutex_lock(&fullstop_mutex);
if (fullstop == FULLSTOP_DONTSTOP) {
if (ACCESS_ONCE(fullstop) == FULLSTOP_DONTSTOP) {
VERBOSE_TOROUT_STRING("Unscheduled system shutdown detected");
fullstop = FULLSTOP_SHUTDOWN;
ACCESS_ONCE(fullstop) = FULLSTOP_SHUTDOWN;
} else {
pr_warn("Concurrent rmmod and shutdown illegal!\n");
}
Expand Down Expand Up @@ -575,13 +575,13 @@ EXPORT_SYMBOL_GPL(torture_init_end);
bool torture_cleanup(void)
{
mutex_lock(&fullstop_mutex);
if (fullstop == FULLSTOP_SHUTDOWN) {
if (ACCESS_ONCE(fullstop) == FULLSTOP_SHUTDOWN) {
pr_warn("Concurrent rmmod and shutdown illegal!\n");
mutex_unlock(&fullstop_mutex);
schedule_timeout_uninterruptible(10);
return true;
}
fullstop = FULLSTOP_RMMOD;
ACCESS_ONCE(fullstop) = FULLSTOP_RMMOD;
mutex_unlock(&fullstop_mutex);
unregister_reboot_notifier(&torture_shutdown_nb);
torture_shuffle_cleanup();
Expand All @@ -605,6 +605,6 @@ EXPORT_SYMBOL_GPL(torture_must_stop);
*/
bool torture_must_stop_irq(void)
{
return fullstop != FULLSTOP_DONTSTOP;
return ACCESS_ONCE(fullstop) != FULLSTOP_DONTSTOP;
}
EXPORT_SYMBOL_GPL(torture_must_stop_irq);

0 comments on commit 57a2fe9

Please sign in to comment.