]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ipv6: fix _DEVADD() and _DEVUPD() macros
authorEric Dumazet <edumazet@google.com>
Wed, 19 Mar 2025 21:25:16 +0000 (21:25 +0000)
committerJakub Kicinski <kuba@kernel.org>
Tue, 25 Mar 2025 14:31:24 +0000 (07:31 -0700)
ip6_rcv_core() is using:

__IP6_ADD_STATS(net, idev,
IPSTATS_MIB_NOECTPKTS +
(ipv6_get_dsfield(hdr) & INET_ECN_MASK),
max_t(unsigned short, 1, skb_shinfo(skb)->gso_segs));

This is currently evaluating both expressions twice.

Fix _DEVADD() and _DEVUPD() macros to evaluate their arguments once.

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

index 9614006f483c9700168c9734f71440980c09017f..2ccdf85f34f16404157b1cd551c874fdfb20f52a 100644 (file)
@@ -246,17 +246,20 @@ extern int sysctl_mld_qrv;
 #define _DEVADD(net, statname, mod, idev, field, val)                  \
 ({                                                                     \
        struct inet6_dev *_idev = (idev);                               \
+       unsigned long _field = (field);                                 \
+       unsigned long _val = (val);                                     \
        if (likely(_idev != NULL))                                      \
-               mod##SNMP_ADD_STATS((_idev)->stats.statname, (field), (val)); \
-       mod##SNMP_ADD_STATS((net)->mib.statname##_statistics, (field), (val));\
+               mod##SNMP_ADD_STATS((_idev)->stats.statname, _field,  _val); \
+       mod##SNMP_ADD_STATS((net)->mib.statname##_statistics, _field, _val);\
 })
 
 #define _DEVUPD(net, statname, mod, idev, field, val)                  \
 ({                                                                     \
        struct inet6_dev *_idev = (idev);                               \
+       unsigned long _val = (val);                                     \
        if (likely(_idev != NULL))                                      \
-               mod##SNMP_UPD_PO_STATS((_idev)->stats.statname, field, (val)); \
-       mod##SNMP_UPD_PO_STATS((net)->mib.statname##_statistics, field, (val));\
+               mod##SNMP_UPD_PO_STATS((_idev)->stats.statname, field, _val); \
+       mod##SNMP_UPD_PO_STATS((net)->mib.statname##_statistics, field, _val);\
 })
 
 /* MIBs */