mirror of https://gitee.com/openkylin/linux.git
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:
parent
628edaa506
commit
57a2fe90fc
|
@ -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");
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue