]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ipv6: annotate data-races from ip6_make_flowlabel()
authorEric Dumazet <edumazet@google.com>
Thu, 15 Jan 2026 09:41:35 +0000 (09:41 +0000)
committerJakub Kicinski <kuba@kernel.org>
Mon, 19 Jan 2026 17:56:42 +0000 (09:56 -0800)
Use READ_ONCE() to read sysctl values in ip6_make_flowlabel()
and ip6_make_flowlabel()

Add a const qualifier to 'struct net' parameters.

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

index 74fbf1ad8065a6596487b72af70131919a26c5a2..7873b34181d9bbf18cc61522967e6db5d646813c 100644 (file)
@@ -949,10 +949,12 @@ static inline bool ipv6_can_nonlocal_bind(struct net *net,
 
 #define IP6_DEFAULT_AUTO_FLOW_LABELS   IP6_AUTO_FLOW_LABEL_OPTOUT
 
-static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb,
+static inline __be32 ip6_make_flowlabel(const struct net *net,
+                                       struct sk_buff *skb,
                                        __be32 flowlabel, bool autolabel,
                                        struct flowi6 *fl6)
 {
+       u8 auto_flowlabels;
        u32 hash;
 
        /* @flowlabel may include more than a flow label, eg, the traffic class.
@@ -960,10 +962,12 @@ static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb,
         */
        flowlabel &= IPV6_FLOWLABEL_MASK;
 
-       if (flowlabel ||
-           net->ipv6.sysctl.auto_flowlabels == IP6_AUTO_FLOW_LABEL_OFF ||
-           (!autolabel &&
-            net->ipv6.sysctl.auto_flowlabels != IP6_AUTO_FLOW_LABEL_FORCED))
+       if (flowlabel)
+               return flowlabel;
+
+       auto_flowlabels = READ_ONCE(net->ipv6.sysctl.auto_flowlabels);
+       if (auto_flowlabels == IP6_AUTO_FLOW_LABEL_OFF ||
+           (!autolabel && auto_flowlabels != IP6_AUTO_FLOW_LABEL_FORCED))
                return flowlabel;
 
        hash = skb_get_hash_flowi6(skb, fl6);
@@ -976,15 +980,15 @@ static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb,
 
        flowlabel = (__force __be32)hash & IPV6_FLOWLABEL_MASK;
 
-       if (net->ipv6.sysctl.flowlabel_state_ranges)
+       if (READ_ONCE(net->ipv6.sysctl.flowlabel_state_ranges))
                flowlabel |= IPV6_FLOWLABEL_STATELESS_FLAG;
 
        return flowlabel;
 }
 
-static inline int ip6_default_np_autolabel(struct net *net)
+static inline int ip6_default_np_autolabel(const struct net *net)
 {
-       switch (net->ipv6.sysctl.auto_flowlabels) {
+       switch (READ_ONCE(net->ipv6.sysctl.auto_flowlabels)) {
        case IP6_AUTO_FLOW_LABEL_OFF:
        case IP6_AUTO_FLOW_LABEL_OPTIN:
        default:
@@ -995,13 +999,13 @@ static inline int ip6_default_np_autolabel(struct net *net)
        }
 }
 #else
-static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb,
+static inline __be32 ip6_make_flowlabel(const struct net *net, struct sk_buff *skb,
                                        __be32 flowlabel, bool autolabel,
                                        struct flowi6 *fl6)
 {
        return flowlabel;
 }
-static inline int ip6_default_np_autolabel(struct net *net)
+static inline int ip6_default_np_autolabel(const struct net *net)
 {
        return 0;
 }