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: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Reviewed-by: Josh Triplett <josh@joshtriplett.org>
This commit is contained in:
@@ -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);
|
|||||||
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);
|
|||||||
*/
|
*/
|
||||||
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);
|
||||||
|
Reference in New Issue
Block a user