rcu: Mark accesses to boost_starttime
authorPaul E. McKenney <paulmck@kernel.org>
Mon, 13 Dec 2021 19:05:07 +0000 (11:05 -0800)
committerPaul E. McKenney <paulmck@kernel.org>
Wed, 2 Feb 2022 01:19:02 +0000 (17:19 -0800)
The boost_starttime shared variable has conflicting unmarked C-language
accesses, which are dangerous at best.  This commit therefore adds
appropriate marking.  This was found by KCSAN.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
kernel/rcu/rcutorture.c

index 422f7e4..829ae0b 100644 (file)
@@ -997,7 +997,7 @@ static int rcu_torture_boost(void *arg)
                        goto checkwait;
 
                /* Wait for the next test interval. */
-               oldstarttime = boost_starttime;
+               oldstarttime = READ_ONCE(boost_starttime);
                while (time_before(jiffies, oldstarttime)) {
                        schedule_timeout_interruptible(oldstarttime - jiffies);
                        if (stutter_wait("rcu_torture_boost"))
@@ -1041,10 +1041,11 @@ static int rcu_torture_boost(void *arg)
                 * interval.  Besides, we are running at RT priority,
                 * so delays should be relatively rare.
                 */
-               while (oldstarttime == boost_starttime && !kthread_should_stop()) {
+               while (oldstarttime == READ_ONCE(boost_starttime) && !kthread_should_stop()) {
                        if (mutex_trylock(&boost_mutex)) {
                                if (oldstarttime == boost_starttime) {
-                                       boost_starttime = jiffies + test_boost_interval * HZ;
+                                       WRITE_ONCE(boost_starttime,
+                                                  jiffies + test_boost_interval * HZ);
                                        n_rcu_torture_boosts++;
                                }
                                mutex_unlock(&boost_mutex);