Commit 57a2fe90 authored by Paul E. McKenney's avatar Paul E. McKenney

rcutorture: Apply ACCESS_ONCE() to racy fullstop accesses

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: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Reviewed-by: default avatarJosh Triplett <josh@joshtriplett.org>
parent 628edaa5
...@@ -439,9 +439,9 @@ static int torture_shutdown_notify(struct notifier_block *unused1, ...@@ -439,9 +439,9 @@ static int torture_shutdown_notify(struct notifier_block *unused1,
unsigned long unused2, void *unused3) unsigned long unused2, void *unused3)
{ {
mutex_lock(&fullstop_mutex); mutex_lock(&fullstop_mutex);
if (fullstop == FULLSTOP_DONTSTOP) { if (ACCESS_ONCE(fullstop) == FULLSTOP_DONTSTOP) {
VERBOSE_TOROUT_STRING("Unscheduled system shutdown detected"); VERBOSE_TOROUT_STRING("Unscheduled system shutdown detected");
fullstop = FULLSTOP_SHUTDOWN; ACCESS_ONCE(fullstop) = FULLSTOP_SHUTDOWN;
} else { } else {
pr_warn("Concurrent rmmod and shutdown illegal!\n"); pr_warn("Concurrent rmmod and shutdown illegal!\n");
} }
...@@ -575,13 +575,13 @@ EXPORT_SYMBOL_GPL(torture_init_end); ...@@ -575,13 +575,13 @@ EXPORT_SYMBOL_GPL(torture_init_end);
bool torture_cleanup(void) bool torture_cleanup(void)
{ {
mutex_lock(&fullstop_mutex); mutex_lock(&fullstop_mutex);
if (fullstop == FULLSTOP_SHUTDOWN) { if (ACCESS_ONCE(fullstop) == FULLSTOP_SHUTDOWN) {
pr_warn("Concurrent rmmod and shutdown illegal!\n"); pr_warn("Concurrent rmmod and shutdown illegal!\n");
mutex_unlock(&fullstop_mutex); mutex_unlock(&fullstop_mutex);
schedule_timeout_uninterruptible(10); schedule_timeout_uninterruptible(10);
return true; return true;
} }
fullstop = FULLSTOP_RMMOD; ACCESS_ONCE(fullstop) = FULLSTOP_RMMOD;
mutex_unlock(&fullstop_mutex); mutex_unlock(&fullstop_mutex);
unregister_reboot_notifier(&torture_shutdown_nb); unregister_reboot_notifier(&torture_shutdown_nb);
torture_shuffle_cleanup(); torture_shuffle_cleanup();
...@@ -605,6 +605,6 @@ EXPORT_SYMBOL_GPL(torture_must_stop); ...@@ -605,6 +605,6 @@ EXPORT_SYMBOL_GPL(torture_must_stop);
*/ */
bool torture_must_stop_irq(void) bool torture_must_stop_irq(void)
{ {
return fullstop != FULLSTOP_DONTSTOP; return ACCESS_ONCE(fullstop) != FULLSTOP_DONTSTOP;
} }
EXPORT_SYMBOL_GPL(torture_must_stop_irq); EXPORT_SYMBOL_GPL(torture_must_stop_irq);
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