Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ipv6: fix _DEVADD() and _DEVUPD() macros

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>

authored by

Eric Dumazet and committed by
Jakub Kicinski
b709857e 4a5524a2

+7 -4
+7 -4
include/net/ipv6.h
··· 246 246 #define _DEVADD(net, statname, mod, idev, field, val) \ 247 247 ({ \ 248 248 struct inet6_dev *_idev = (idev); \ 249 + unsigned long _field = (field); \ 250 + unsigned long _val = (val); \ 249 251 if (likely(_idev != NULL)) \ 250 - mod##SNMP_ADD_STATS((_idev)->stats.statname, (field), (val)); \ 251 - mod##SNMP_ADD_STATS((net)->mib.statname##_statistics, (field), (val));\ 252 + mod##SNMP_ADD_STATS((_idev)->stats.statname, _field, _val); \ 253 + mod##SNMP_ADD_STATS((net)->mib.statname##_statistics, _field, _val);\ 252 254 }) 253 255 254 256 #define _DEVUPD(net, statname, mod, idev, field, val) \ 255 257 ({ \ 256 258 struct inet6_dev *_idev = (idev); \ 259 + unsigned long _val = (val); \ 257 260 if (likely(_idev != NULL)) \ 258 - mod##SNMP_UPD_PO_STATS((_idev)->stats.statname, field, (val)); \ 259 - mod##SNMP_UPD_PO_STATS((net)->mib.statname##_statistics, field, (val));\ 261 + mod##SNMP_UPD_PO_STATS((_idev)->stats.statname, field, _val); \ 262 + mod##SNMP_UPD_PO_STATS((net)->mib.statname##_statistics, field, _val);\ 260 263 }) 261 264 262 265 /* MIBs */