[PATCH net-next 00/14] net: annotate data-races around sysctl knobs

From: Jiayuan Chen

Date: Sun Nov 08 2026 - 21:56:32 EST


While testing the recent sysctl range fixes I noticed that a lot of our
sysctl knobs are read with plain loads while the handlers update them
with WRITE_ONCE() and no lock, so KCSAN reports them as data races. I
then used an LLM to go through every ctl_table under net/ and list the
readers that were left behind. This series annotates them with
READ_ONCE(), and adds WRITE_ONCE() to a few custom handlers and netlink
paths that store to the same fields with plain writes. Most of it is a
plain READ_ONCE() at each read; where a function reads the same knob
twice to make one decision, it now reads it once into a local, so the
comparison and the value it acts on cannot come from two different
writes.

There are no Fixes tags. Done one knob per patch this would be well over
a hundred commits, so I grouped them by subsystem and feature instead to
keep the review manageable. If maintainers prefer, I can split it up
further with a Fixes tag on each one, as several smaller series.

No functional change. KCSAN does hit these, e.g. toggling
net.ipv6.icmp.echo_ignore_all while receiving ICMPv6 echo requests:

BUG: KCSAN: data-race in icmpv6_rcv / proc_dou8vec_minmax

write (marked) to 0xffffffff8ee2940d of 1 bytes by task 504 on cpu 0:
proc_dou8vec_minmax+0x1ab/0x1f0
proc_sys_call_handler+0x282/0x3a0
proc_sys_write+0x13/0x20
...

read to 0xffffffff8ee2940d of 1 bytes by interrupt on cpu 3:
icmpv6_rcv+0x99d/0xd40
ip6_protocol_deliver_rcu+0x787/0x9a0
ip6_input_finish+0xb0/0x1b0
ip6_input+0xa8/0x250
ipv6_rcv+0x14b/0x1c0
...

value changed: 0x01 -> 0x00

Jiayuan Chen (14):
ipv4: annotate data-races around ip_rt_* sysctls
inet: frags: annotate data-races around fqdir->timeout and
fqdir->max_dist
ipv6: annotate data-races around addrconf sysctls
ipv6: annotate data-races around icmpv6 reply sysctls
calipso: annotate data-races around cache sysctls
sctp: annotate data-races around sctp sysctls
mptcp: annotate data-races around pernet sysctls
rds: annotate data-races around core rds sysctls
netfilter: conntrack: annotate data-races around conntrack sysctls
netfilter: bridge: annotate data-races around br_netfilter and nf_log
sysctls
ipvs: annotate data-races around lblc_expiration and lblcr_expiration
net/smc: annotate data-races around smc sysctls
netfilter: conntrack: annotate data-races around timeout and tcp
sysctls
netfilter: cttimeout: annotate data-races around the default timeouts

include/net/ipv6.h | 2 +-
include/net/netfilter/nf_conntrack_acct.h | 6 +-
.../net/netfilter/nf_conntrack_timestamp.h | 2 +-
net/bridge/br_netfilter_hooks.c | 20 ++--
net/bridge/netfilter/ebt_log.c | 2 +-
net/ipv4/inet_fragment.c | 2 +-
net/ipv4/ip_fragment.c | 6 +-
net/ipv4/route.c | 34 +++---
net/ipv6/addrconf.c | 22 ++--
net/ipv6/calipso.c | 6 +-
net/ipv6/icmp.c | 10 +-
net/ipv6/ndisc.c | 2 +-
net/ipv6/route.c | 8 +-
net/mptcp/ctrl.c | 18 +--
net/netfilter/ipvs/ip_vs_lblc.c | 2 +-
net/netfilter/ipvs/ip_vs_lblcr.c | 2 +-
net/netfilter/nf_conntrack_core.c | 8 +-
net/netfilter/nf_conntrack_ecache.c | 2 +-
net/netfilter/nf_conntrack_expect.c | 2 +-
net/netfilter/nf_conntrack_netlink.c | 2 +-
net/netfilter/nf_conntrack_proto.c | 6 +-
net/netfilter/nf_conntrack_proto_generic.c | 8 +-
net/netfilter/nf_conntrack_proto_gre.c | 20 ++--
net/netfilter/nf_conntrack_proto_icmp.c | 12 +-
net/netfilter/nf_conntrack_proto_icmpv6.c | 12 +-
net/netfilter/nf_conntrack_proto_sctp.c | 13 ++-
net/netfilter/nf_conntrack_proto_tcp.c | 110 +++++++++---------
net/netfilter/nf_conntrack_proto_udp.c | 24 ++--
net/netfilter/nf_flow_table_core.c | 4 +-
net/netfilter/nf_log_syslog.c | 2 +-
net/rds/recv.c | 2 +-
net/rds/send.c | 8 +-
net/rds/threads.c | 4 +-
net/sctp/associola.c | 2 +-
net/sctp/bind_addr.c | 2 +-
net/sctp/endpointola.c | 14 +--
net/sctp/input.c | 2 +-
net/sctp/sm_make_chunk.c | 6 +-
net/sctp/sm_sideeffect.c | 2 +-
net/sctp/sm_statefuns.c | 6 +-
net/sctp/socket.c | 46 ++++----
net/sctp/sysctl.c | 16 +--
net/sctp/transport.c | 6 +-
net/smc/af_smc.c | 8 +-
net/smc/smc_clc.c | 8 +-
net/smc/smc_core.c | 2 +-
net/smc/smc_tx.c | 2 +-
47 files changed, 259 insertions(+), 246 deletions(-)

--
2.43.0