Re: [PATCH net-next 00/14] net: annotate data-races around sysctl knobs
From: Jason Xing
Date: Sun Nov 08 2026 - 22:13:18 EST
On Mon, Nov 9, 2026 at 10:55 AM Jiayuan Chen <jiayuan.chen@xxxxxxxxx> wrote:
>
> 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.
Over the last year, I've been thinking about the annotation stuff
especially around sysctls, which, I suppose, shouldn't actually affect
the real workload but does affect the outcome of the syzbot.
Out of sheer curiosity, my question would be what is the point of
trying to change all of them? Or what kind of benefits can we get from
the big series?
Thanks,
Jason
>
> 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
>
>