OSDN Git Service

rcutorture: Add READ_ONCE() to rcu_torture_count and rcu_torture_batch
authorPaul E. McKenney <paulmck@kernel.org>
Sat, 4 Jan 2020 00:27:00 +0000 (16:27 -0800)
committerPaul E. McKenney <paulmck@kernel.org>
Fri, 21 Feb 2020 00:03:31 +0000 (16:03 -0800)
The rcutorture rcu_torture_count and rcu_torture_batch per-CPU variables
are read locklessly, so this commit adds the READ_ONCE() to a load in
order to avoid various types of compiler vandalism^Woptimization.

This data race was reported by KCSAN. Not appropriate for backporting
due to failure being unlikely and due to this being rcutorture.

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

index 124160a..0b9ce9a 100644 (file)
@@ -1413,8 +1413,8 @@ rcu_torture_stats_print(void)
 
        for_each_possible_cpu(cpu) {
                for (i = 0; i < RCU_TORTURE_PIPE_LEN + 1; i++) {
-                       pipesummary[i] += per_cpu(rcu_torture_count, cpu)[i];
-                       batchsummary[i] += per_cpu(rcu_torture_batch, cpu)[i];
+                       pipesummary[i] += READ_ONCE(per_cpu(rcu_torture_count, cpu)[i]);
+                       batchsummary[i] += READ_ONCE(per_cpu(rcu_torture_batch, cpu)[i]);
                }
        }
        for (i = RCU_TORTURE_PIPE_LEN - 1; i >= 0; i--) {