]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ipv6: snmp: do not use SNMP_MIB_SENTINEL anymore
authorEric Dumazet <edumazet@google.com>
Fri, 5 Sep 2025 16:58:06 +0000 (16:58 +0000)
committerJakub Kicinski <kuba@kernel.org>
Tue, 9 Sep 2025 01:06:20 +0000 (18:06 -0700)
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>
include/net/ip.h
net/ipv6/proc.c

index 6dbd2bf8fa9c96dc342acc171471704981123eec..a1624e8db1abdc87a8c4e30e41c231932688cb74 100644 (file)
@@ -338,6 +338,19 @@ static inline u64 snmp_fold_field64(void __percpu *mib, int offt, size_t syncp_o
        } \
 }
 
+#define snmp_get_cpu_field64_batch_cnt(buff64, stats_list, cnt,        \
+                                      mib_statistic, offset)   \
+{ \
+       int i, c; \
+       for_each_possible_cpu(c) { \
+               for (i = 0; i < cnt; i++) \
+                       buff64[i] += snmp_get_cpu_field64( \
+                                       mib_statistic, \
+                                       c, stats_list[i].entry, \
+                                       offset); \
+       } \
+}
+
 #define snmp_get_cpu_field_batch(buff, stats_list, mib_statistic) \
 { \
        int i, c; \
@@ -349,6 +362,17 @@ static inline u64 snmp_fold_field64(void __percpu *mib, int offt, size_t syncp_o
        } \
 }
 
+#define snmp_get_cpu_field_batch_cnt(buff, stats_list, cnt, mib_statistic) \
+{ \
+       int i, c; \
+       for_each_possible_cpu(c) { \
+               for (i = 0; i < cnt; i++) \
+                       buff[i] += snmp_get_cpu_field( \
+                                               mib_statistic, \
+                                               c, stats_list[i].entry); \
+       } \
+}
+
 static inline void inet_get_local_port_range(const struct net *net, int *low, int *high)
 {
        u32 range = READ_ONCE(net->ipv4.ip_local_ports.range);
index e96f14a3683405e3191fe328e3fce5e095a7f448..92ed04729c2f5403a716bca2dc708bc9157bd726 100644 (file)
@@ -85,7 +85,6 @@ static const struct snmp_mib snmp6_ipstats_list[] = {
        SNMP_MIB_ITEM("Ip6InECT0Pkts", IPSTATS_MIB_ECT0PKTS),
        SNMP_MIB_ITEM("Ip6InCEPkts", IPSTATS_MIB_CEPKTS),
        SNMP_MIB_ITEM("Ip6OutTransmits", IPSTATS_MIB_OUTPKTS),
-       SNMP_MIB_SENTINEL
 };
 
 static const struct snmp_mib snmp6_icmp6_list[] = {
@@ -96,7 +95,6 @@ static const struct snmp_mib snmp6_icmp6_list[] = {
        SNMP_MIB_ITEM("Icmp6OutErrors", ICMP6_MIB_OUTERRORS),
        SNMP_MIB_ITEM("Icmp6InCsumErrors", ICMP6_MIB_CSUMERRORS),
        SNMP_MIB_ITEM("Icmp6OutRateLimitHost", ICMP6_MIB_RATELIMITHOST),
-       SNMP_MIB_SENTINEL
 };
 
 static const struct snmp_mib snmp6_udp6_list[] = {
@@ -109,7 +107,6 @@ static const struct snmp_mib snmp6_udp6_list[] = {
        SNMP_MIB_ITEM("Udp6InCsumErrors", UDP_MIB_CSUMERRORS),
        SNMP_MIB_ITEM("Udp6IgnoredMulti", UDP_MIB_IGNOREDMULTI),
        SNMP_MIB_ITEM("Udp6MemErrors", UDP_MIB_MEMERRORS),
-       SNMP_MIB_SENTINEL
 };
 
 static const struct snmp_mib snmp6_udplite6_list[] = {
@@ -121,7 +118,6 @@ static const struct snmp_mib snmp6_udplite6_list[] = {
        SNMP_MIB_ITEM("UdpLite6SndbufErrors", UDP_MIB_SNDBUFERRORS),
        SNMP_MIB_ITEM("UdpLite6InCsumErrors", UDP_MIB_CSUMERRORS),
        SNMP_MIB_ITEM("UdpLite6MemErrors", UDP_MIB_MEMERRORS),
-       SNMP_MIB_SENTINEL
 };
 
 static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, atomic_long_t *smib)
@@ -182,35 +178,37 @@ static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, atomic_long_t *smib)
  */
 static void snmp6_seq_show_item(struct seq_file *seq, void __percpu *pcpumib,
                                atomic_long_t *smib,
-                               const struct snmp_mib *itemlist)
+                               const struct snmp_mib *itemlist,
+                               int cnt)
 {
        unsigned long buff[SNMP_MIB_MAX];
        int i;
 
        if (pcpumib) {
-               memset(buff, 0, sizeof(unsigned long) * SNMP_MIB_MAX);
+               memset(buff, 0, sizeof(unsigned long) * cnt);
 
-               snmp_get_cpu_field_batch(buff, itemlist, pcpumib);
-               for (i = 0; itemlist[i].name; i++)
+               snmp_get_cpu_field_batch_cnt(buff, itemlist, cnt, pcpumib);
+               for (i = 0; i < cnt; i++)
                        seq_printf(seq, "%-32s\t%lu\n",
                                   itemlist[i].name, buff[i]);
        } else {
-               for (i = 0; itemlist[i].name; i++)
+               for (i = 0; i < cnt; i++)
                        seq_printf(seq, "%-32s\t%lu\n", itemlist[i].name,
                                   atomic_long_read(smib + itemlist[i].entry));
        }
 }
 
 static void snmp6_seq_show_item64(struct seq_file *seq, void __percpu *mib,
-                                 const struct snmp_mib *itemlist, size_t syncpoff)
+                                 const struct snmp_mib *itemlist,
+                                 int cnt, size_t syncpoff)
 {
        u64 buff64[SNMP_MIB_MAX];
        int i;
 
-       memset(buff64, 0, sizeof(u64) * SNMP_MIB_MAX);
+       memset(buff64, 0, sizeof(u64) * cnt);
 
-       snmp_get_cpu_field64_batch(buff64, itemlist, mib, syncpoff);
-       for (i = 0; itemlist[i].name; i++)
+       snmp_get_cpu_field64_batch_cnt(buff64, itemlist, cnt, mib, syncpoff);
+       for (i = 0; i < cnt; i++)
                seq_printf(seq, "%-32s\t%llu\n", itemlist[i].name, buff64[i]);
 }
 
@@ -219,14 +217,19 @@ static int snmp6_seq_show(struct seq_file *seq, void *v)
        struct net *net = (struct net *)seq->private;
 
        snmp6_seq_show_item64(seq, net->mib.ipv6_statistics,
-                           snmp6_ipstats_list, offsetof(struct ipstats_mib, syncp));
+                             snmp6_ipstats_list,
+                             ARRAY_SIZE(snmp6_ipstats_list),
+                             offsetof(struct ipstats_mib, syncp));
        snmp6_seq_show_item(seq, net->mib.icmpv6_statistics,
-                           NULL, snmp6_icmp6_list);
+                           NULL, snmp6_icmp6_list,
+                           ARRAY_SIZE(snmp6_icmp6_list));
        snmp6_seq_show_icmpv6msg(seq, net->mib.icmpv6msg_statistics->mibs);
        snmp6_seq_show_item(seq, net->mib.udp_stats_in6,
-                           NULL, snmp6_udp6_list);
+                           NULL, snmp6_udp6_list,
+                           ARRAY_SIZE(snmp6_udp6_list));
        snmp6_seq_show_item(seq, net->mib.udplite_stats_in6,
-                           NULL, snmp6_udplite6_list);
+                           NULL, snmp6_udplite6_list,
+                           ARRAY_SIZE(snmp6_udplite6_list));
        return 0;
 }
 
@@ -236,9 +239,11 @@ static int snmp6_dev_seq_show(struct seq_file *seq, void *v)
 
        seq_printf(seq, "%-32s\t%u\n", "ifIndex", idev->dev->ifindex);
        snmp6_seq_show_item64(seq, idev->stats.ipv6,
-                           snmp6_ipstats_list, offsetof(struct ipstats_mib, syncp));
+                             snmp6_ipstats_list,
+                             ARRAY_SIZE(snmp6_ipstats_list),
+                             offsetof(struct ipstats_mib, syncp));
        snmp6_seq_show_item(seq, NULL, idev->stats.icmpv6dev->mibs,
-                           snmp6_icmp6_list);
+                           snmp6_icmp6_list, ARRAY_SIZE(snmp6_icmp6_list));
        snmp6_seq_show_icmpv6msg(seq, idev->stats.icmpv6msgdev->mibs);
        return 0;
 }