net: add data-race annotations in softnet_seq_show()
authorEric Dumazet <edumazet@google.com>
Mon, 7 Apr 2025 16:36:01 +0000 (16:36 +0000)
committerJakub Kicinski <kuba@kernel.org>
Tue, 8 Apr 2025 19:30:55 +0000 (12:30 -0700)
softnet_seq_show() reads several fields that might be updated
concurrently. Add READ_ONCE() and WRITE_ONCE() annotations.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Link: https://patch.msgid.link/20250407163602.170356-4-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/dev.c
net/core/net-procfs.c

index 969883173182b368aacdfb3471486421fc51a936..4ccc6dc5303e8e15f5dca65856aad5fdfd8aae17 100644 (file)
@@ -4953,7 +4953,8 @@ static void rps_trigger_softirq(void *data)
        struct softnet_data *sd = data;
 
        ____napi_schedule(sd, &sd->backlog);
-       sd->received_rps++;
+       /* Pairs with READ_ONCE() in softnet_seq_show() */
+       WRITE_ONCE(sd->received_rps, sd->received_rps + 1);
 }
 
 #endif /* CONFIG_RPS */
@@ -7523,7 +7524,8 @@ start:
                 */
                if (unlikely(budget <= 0 ||
                             time_after_eq(jiffies, time_limit))) {
-                       sd->time_squeeze++;
+                       /* Pairs with READ_ONCE() in softnet_seq_show() */
+                       WRITE_ONCE(sd->time_squeeze, sd->time_squeeze + 1);
                        break;
                }
        }
index 69782d62fbe1935930eda5fd895b49573ba88c98..4f0f0709a1cbc702dc44debc6325d20008b08d86 100644 (file)
@@ -145,11 +145,11 @@ static int softnet_seq_show(struct seq_file *seq, void *v)
        seq_printf(seq,
                   "%08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x "
                   "%08x %08x\n",
-                  sd->processed, atomic_read(&sd->dropped),
-                  sd->time_squeeze, 0,
+                  READ_ONCE(sd->processed), atomic_read(&sd->dropped),
+                  READ_ONCE(sd->time_squeeze), 0,
                   0, 0, 0, 0, /* was fastroute */
                   0,   /* was cpu_collision */
-                  sd->received_rps, flow_limit_count,
+                  READ_ONCE(sd->received_rps), flow_limit_count,
                   input_qlen + process_qlen, (int)seq->index,
                   input_qlen, process_qlen);
        return 0;