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: snmp: do not use SNMP_MIB_SENTINEL anymore

Use ARRAY_SIZE(), so that we know the limit at compile time.

Following patch needs this preliminary change.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Sabrina Dubroca <sd@queasysnail.net>
Link: https://patch.msgid.link/20250905165813.1470708-3-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Eric Dumazet and committed by
Jakub Kicinski
ceac1fb2 b7fe8c1b

+48 -19
+24
include/net/ip.h
··· 338 338 } \ 339 339 } 340 340 341 + #define snmp_get_cpu_field64_batch_cnt(buff64, stats_list, cnt, \ 342 + mib_statistic, offset) \ 343 + { \ 344 + int i, c; \ 345 + for_each_possible_cpu(c) { \ 346 + for (i = 0; i < cnt; i++) \ 347 + buff64[i] += snmp_get_cpu_field64( \ 348 + mib_statistic, \ 349 + c, stats_list[i].entry, \ 350 + offset); \ 351 + } \ 352 + } 353 + 341 354 #define snmp_get_cpu_field_batch(buff, stats_list, mib_statistic) \ 342 355 { \ 343 356 int i, c; \ 344 357 for_each_possible_cpu(c) { \ 345 358 for (i = 0; stats_list[i].name; i++) \ 359 + buff[i] += snmp_get_cpu_field( \ 360 + mib_statistic, \ 361 + c, stats_list[i].entry); \ 362 + } \ 363 + } 364 + 365 + #define snmp_get_cpu_field_batch_cnt(buff, stats_list, cnt, mib_statistic) \ 366 + { \ 367 + int i, c; \ 368 + for_each_possible_cpu(c) { \ 369 + for (i = 0; i < cnt; i++) \ 346 370 buff[i] += snmp_get_cpu_field( \ 347 371 mib_statistic, \ 348 372 c, stats_list[i].entry); \
+24 -19
net/ipv6/proc.c
··· 85 85 SNMP_MIB_ITEM("Ip6InECT0Pkts", IPSTATS_MIB_ECT0PKTS), 86 86 SNMP_MIB_ITEM("Ip6InCEPkts", IPSTATS_MIB_CEPKTS), 87 87 SNMP_MIB_ITEM("Ip6OutTransmits", IPSTATS_MIB_OUTPKTS), 88 - SNMP_MIB_SENTINEL 89 88 }; 90 89 91 90 static const struct snmp_mib snmp6_icmp6_list[] = { ··· 95 96 SNMP_MIB_ITEM("Icmp6OutErrors", ICMP6_MIB_OUTERRORS), 96 97 SNMP_MIB_ITEM("Icmp6InCsumErrors", ICMP6_MIB_CSUMERRORS), 97 98 SNMP_MIB_ITEM("Icmp6OutRateLimitHost", ICMP6_MIB_RATELIMITHOST), 98 - SNMP_MIB_SENTINEL 99 99 }; 100 100 101 101 static const struct snmp_mib snmp6_udp6_list[] = { ··· 107 109 SNMP_MIB_ITEM("Udp6InCsumErrors", UDP_MIB_CSUMERRORS), 108 110 SNMP_MIB_ITEM("Udp6IgnoredMulti", UDP_MIB_IGNOREDMULTI), 109 111 SNMP_MIB_ITEM("Udp6MemErrors", UDP_MIB_MEMERRORS), 110 - SNMP_MIB_SENTINEL 111 112 }; 112 113 113 114 static const struct snmp_mib snmp6_udplite6_list[] = { ··· 118 121 SNMP_MIB_ITEM("UdpLite6SndbufErrors", UDP_MIB_SNDBUFERRORS), 119 122 SNMP_MIB_ITEM("UdpLite6InCsumErrors", UDP_MIB_CSUMERRORS), 120 123 SNMP_MIB_ITEM("UdpLite6MemErrors", UDP_MIB_MEMERRORS), 121 - SNMP_MIB_SENTINEL 122 124 }; 123 125 124 126 static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, atomic_long_t *smib) ··· 178 182 */ 179 183 static void snmp6_seq_show_item(struct seq_file *seq, void __percpu *pcpumib, 180 184 atomic_long_t *smib, 181 - const struct snmp_mib *itemlist) 185 + const struct snmp_mib *itemlist, 186 + int cnt) 182 187 { 183 188 unsigned long buff[SNMP_MIB_MAX]; 184 189 int i; 185 190 186 191 if (pcpumib) { 187 - memset(buff, 0, sizeof(unsigned long) * SNMP_MIB_MAX); 192 + memset(buff, 0, sizeof(unsigned long) * cnt); 188 193 189 - snmp_get_cpu_field_batch(buff, itemlist, pcpumib); 190 - for (i = 0; itemlist[i].name; i++) 194 + snmp_get_cpu_field_batch_cnt(buff, itemlist, cnt, pcpumib); 195 + for (i = 0; i < cnt; i++) 191 196 seq_printf(seq, "%-32s\t%lu\n", 192 197 itemlist[i].name, buff[i]); 193 198 } else { 194 - for (i = 0; itemlist[i].name; i++) 199 + for (i = 0; i < cnt; i++) 195 200 seq_printf(seq, "%-32s\t%lu\n", itemlist[i].name, 196 201 atomic_long_read(smib + itemlist[i].entry)); 197 202 } 198 203 } 199 204 200 205 static void snmp6_seq_show_item64(struct seq_file *seq, void __percpu *mib, 201 - const struct snmp_mib *itemlist, size_t syncpoff) 206 + const struct snmp_mib *itemlist, 207 + int cnt, size_t syncpoff) 202 208 { 203 209 u64 buff64[SNMP_MIB_MAX]; 204 210 int i; 205 211 206 - memset(buff64, 0, sizeof(u64) * SNMP_MIB_MAX); 212 + memset(buff64, 0, sizeof(u64) * cnt); 207 213 208 - snmp_get_cpu_field64_batch(buff64, itemlist, mib, syncpoff); 209 - for (i = 0; itemlist[i].name; i++) 214 + snmp_get_cpu_field64_batch_cnt(buff64, itemlist, cnt, mib, syncpoff); 215 + for (i = 0; i < cnt; i++) 210 216 seq_printf(seq, "%-32s\t%llu\n", itemlist[i].name, buff64[i]); 211 217 } 212 218 ··· 217 219 struct net *net = (struct net *)seq->private; 218 220 219 221 snmp6_seq_show_item64(seq, net->mib.ipv6_statistics, 220 - snmp6_ipstats_list, offsetof(struct ipstats_mib, syncp)); 222 + snmp6_ipstats_list, 223 + ARRAY_SIZE(snmp6_ipstats_list), 224 + offsetof(struct ipstats_mib, syncp)); 221 225 snmp6_seq_show_item(seq, net->mib.icmpv6_statistics, 222 - NULL, snmp6_icmp6_list); 226 + NULL, snmp6_icmp6_list, 227 + ARRAY_SIZE(snmp6_icmp6_list)); 223 228 snmp6_seq_show_icmpv6msg(seq, net->mib.icmpv6msg_statistics->mibs); 224 229 snmp6_seq_show_item(seq, net->mib.udp_stats_in6, 225 - NULL, snmp6_udp6_list); 230 + NULL, snmp6_udp6_list, 231 + ARRAY_SIZE(snmp6_udp6_list)); 226 232 snmp6_seq_show_item(seq, net->mib.udplite_stats_in6, 227 - NULL, snmp6_udplite6_list); 233 + NULL, snmp6_udplite6_list, 234 + ARRAY_SIZE(snmp6_udplite6_list)); 228 235 return 0; 229 236 } 230 237 ··· 239 236 240 237 seq_printf(seq, "%-32s\t%u\n", "ifIndex", idev->dev->ifindex); 241 238 snmp6_seq_show_item64(seq, idev->stats.ipv6, 242 - snmp6_ipstats_list, offsetof(struct ipstats_mib, syncp)); 239 + snmp6_ipstats_list, 240 + ARRAY_SIZE(snmp6_ipstats_list), 241 + offsetof(struct ipstats_mib, syncp)); 243 242 snmp6_seq_show_item(seq, NULL, idev->stats.icmpv6dev->mibs, 244 - snmp6_icmp6_list); 243 + snmp6_icmp6_list, ARRAY_SIZE(snmp6_icmp6_list)); 245 244 snmp6_seq_show_icmpv6msg(seq, idev->stats.icmpv6msgdev->mibs); 246 245 return 0; 247 246 }