]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ipv6: annotate data-races around sysctl.ip6_rt_gc_interval
authorEric Dumazet <edumazet@google.com>
Thu, 15 Jan 2026 09:41:39 +0000 (09:41 +0000)
committerJakub Kicinski <kuba@kernel.org>
Mon, 19 Jan 2026 17:56:42 +0000 (09:56 -0800)
Add READ_ONCE() on lockless reads of net->ipv6.sysctl.ip6_rt_gc_interval

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20260115094141.3124990-7-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv6/ip6_fib.c

index 2111af022d946d0b9e1a35abdcbac39cbe00f921..174d38c70ac454ac4bd2399a4567862e887150e3 100644 (file)
@@ -1374,14 +1374,14 @@ static void fib6_start_gc(struct net *net, struct fib6_info *rt)
        if (!timer_pending(&net->ipv6.ip6_fib_timer) &&
            (rt->fib6_flags & RTF_EXPIRES))
                mod_timer(&net->ipv6.ip6_fib_timer,
-                         jiffies + net->ipv6.sysctl.ip6_rt_gc_interval);
+                         jiffies + READ_ONCE(net->ipv6.sysctl.ip6_rt_gc_interval));
 }
 
 void fib6_force_start_gc(struct net *net)
 {
        if (!timer_pending(&net->ipv6.ip6_fib_timer))
                mod_timer(&net->ipv6.ip6_fib_timer,
-                         jiffies + net->ipv6.sysctl.ip6_rt_gc_interval);
+                         jiffies + READ_ONCE(net->ipv6.sysctl.ip6_rt_gc_interval));
 }
 
 static void __fib6_update_sernum_upto_root(struct fib6_info *rt,
@@ -2413,6 +2413,7 @@ static void fib6_gc_all(struct net *net, struct fib6_gc_args *gc_args)
 void fib6_run_gc(unsigned long expires, struct net *net, bool force)
 {
        struct fib6_gc_args gc_args;
+       int ip6_rt_gc_interval;
        unsigned long now;
 
        if (force) {
@@ -2421,8 +2422,8 @@ void fib6_run_gc(unsigned long expires, struct net *net, bool force)
                mod_timer(&net->ipv6.ip6_fib_timer, jiffies + HZ);
                return;
        }
-       gc_args.timeout = expires ? (int)expires :
-                         net->ipv6.sysctl.ip6_rt_gc_interval;
+       ip6_rt_gc_interval = READ_ONCE(net->ipv6.sysctl.ip6_rt_gc_interval);
+       gc_args.timeout = expires ? (int)expires : ip6_rt_gc_interval;
        gc_args.more = 0;
 
        fib6_gc_all(net, &gc_args);
@@ -2431,8 +2432,7 @@ void fib6_run_gc(unsigned long expires, struct net *net, bool force)
 
        if (gc_args.more)
                mod_timer(&net->ipv6.ip6_fib_timer,
-                         round_jiffies(now
-                                       + net->ipv6.sysctl.ip6_rt_gc_interval));
+                         round_jiffies(now + ip6_rt_gc_interval));
        else
                timer_delete(&net->ipv6.ip6_fib_timer);
        spin_unlock_bh(&net->ipv6.fib6_gc_lock);