From 0019aa65bbc6223b3c29f519c0c8e040b26ef97e Mon Sep 17 00:00:00 2001 From: Linkui Xiao Date: Thu, 10 Sep 2026 17:34:52 +0800 Subject: [PATCH] ipmr, ip6mr: annotate data-races in vif_seq_show() ipmr_vif_seq_show() and ip6mr_vif_seq_show() read vif->bytes_in, vif->pkt_in, vif->bytes_out and vif->pkt_out with only rcu_read_lock() held: since commit b96ef16d2f83 ("ipmr: convert /proc handlers to rcu_read_lock()") both seq_start helpers are annotated __acquires(RCU) and no longer take mrt_lock. Those counters are updated from softirq context and the writers already use WRITE_ONCE(): ipmr_prepare_xmit() and ip_mr_forward() on the IPv4 side, ip6mr_prepare_xmit() and ip6_mr_forward() on the IPv6 side. The other lockless readers use READ_ONCE() as well - ipmr_ioctl(), ipmr_compat_ioctl(), ipmr_fill_vif(), ip6mr_ioctl() and ip6mr_compat_ioctl(). The two vif_seq_show() helpers are the only remaining bare readers, so KCSAN flags them and the compiler is free to tear or reload the values while the /proc/net/ip_mr_vif and /proc/net/ip6_mr_vif lines are being formatted. Annotate them like the other readers; these are plain statistics, no locking is needed. Signed-off-by: Linkui Xiao Link: https://patch.msgid.link/20260910093452.2070079-1-xiaolinkui@126.com Signed-off-by: Jakub Kicinski --- net/ipv4/ipmr.c | 5 +++-- net/ipv6/ip6mr.c | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index b9c544d48c45..1187bfc8a09d 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c @@ -3178,8 +3178,9 @@ static int ipmr_vif_seq_show(struct seq_file *seq, void *v) seq_printf(seq, "%2td %-10s %8ld %7ld %8ld %7ld %05X %08X %08X\n", vif - mrt->vif_table, - name, vif->bytes_in, vif->pkt_in, - vif->bytes_out, vif->pkt_out, + name, + READ_ONCE(vif->bytes_in), READ_ONCE(vif->pkt_in), + READ_ONCE(vif->bytes_out), READ_ONCE(vif->pkt_out), vif->flags, vif->local, vif->remote); } return 0; diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 9d8116b5edb1..36f117ad3670 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c @@ -485,8 +485,9 @@ static int ip6mr_vif_seq_show(struct seq_file *seq, void *v) seq_printf(seq, "%2td %-10s %8ld %7ld %8ld %7ld %05X\n", vif - mrt->vif_table, - name, vif->bytes_in, vif->pkt_in, - vif->bytes_out, vif->pkt_out, + name, + READ_ONCE(vif->bytes_in), READ_ONCE(vif->pkt_in), + READ_ONCE(vif->bytes_out), READ_ONCE(vif->pkt_out), vif->flags); } return 0;