Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+5 −5
Original line number Original line Diff line number Diff line
@@ -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);