rcutorture: Annotation lockless accesses to rcu_torture_current
authorPaul E. McKenney <paulmck@kernel.org>
Thu, 9 Jan 2020 03:58:13 +0000 (19:58 -0800)
committerPaul E. McKenney <paulmck@kernel.org>
Fri, 21 Feb 2020 00:03:31 +0000 (16:03 -0800)
The rcutorture global variable rcu_torture_current is accessed locklessly,
so it must use the RCU pointer load/store primitives.  This commit
therefore adds several that were missed.

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

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

index 0b9ce9a006232c3a43ebfe9fda7b8c74a9b289de..7e01e9a87352ebbace9820191c37d977a8a91d46 100644 (file)
@@ -1407,6 +1407,7 @@ rcu_torture_stats_print(void)
        int i;
        long pipesummary[RCU_TORTURE_PIPE_LEN + 1] = { 0 };
        long batchsummary[RCU_TORTURE_PIPE_LEN + 1] = { 0 };
+       struct rcu_torture *rtcp;
        static unsigned long rtcv_snap = ULONG_MAX;
        static bool splatted;
        struct task_struct *wtp;
@@ -1423,10 +1424,10 @@ rcu_torture_stats_print(void)
        }
 
        pr_alert("%s%s ", torture_type, TORTURE_FLAG);
+       rtcp = rcu_access_pointer(rcu_torture_current);
        pr_cont("rtc: %p %s: %lu tfle: %d rta: %d rtaf: %d rtf: %d ",
-               rcu_torture_current,
-               rcu_torture_current && !rcu_stall_is_suppressed_at_boot()
-                       ? "ver" : "VER",
+               rtcp,
+               rtcp && !rcu_stall_is_suppressed_at_boot() ? "ver" : "VER",
                rcu_torture_current_version,
                list_empty(&rcu_torture_freelist),
                atomic_read(&n_rcu_torture_alloc),
@@ -1482,7 +1483,8 @@ rcu_torture_stats_print(void)
        if (cur_ops->stats)
                cur_ops->stats();
        if (rtcv_snap == rcu_torture_current_version &&
-           rcu_torture_current != NULL && !rcu_stall_is_suppressed()) {
+           rcu_access_pointer(rcu_torture_current) &&
+           !rcu_stall_is_suppressed()) {
                int __maybe_unused flags = 0;
                unsigned long __maybe_unused gp_seq = 0;