Skip to content

Commit b629547

Browse files
edumazetgregkh
authored andcommitted
ipv6: snmp: do not use SNMP_MIB_SENTINEL anymore
[ Upstream commit ceac1fb ] 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> Stable-dep-of: 2fab94b ("ipv6: snmp: do not track per idev ICMP6_MIB_RATELIMITHOST") Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent c60f269 commit b629547

File tree

2 files changed

+48
-19
lines changed

2 files changed

+48
-19
lines changed

include/net/ip.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,19 @@ static inline u64 snmp_fold_field64(void __percpu *mib, int offt, size_t syncp_o
338338
} \
339339
}
340340

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+
341354
#define snmp_get_cpu_field_batch(buff, stats_list, mib_statistic) \
342355
{ \
343356
int i, c; \
@@ -349,6 +362,17 @@ static inline u64 snmp_fold_field64(void __percpu *mib, int offt, size_t syncp_o
349362
} \
350363
}
351364

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++) \
370+
buff[i] += snmp_get_cpu_field( \
371+
mib_statistic, \
372+
c, stats_list[i].entry); \
373+
} \
374+
}
375+
352376
static inline void inet_get_local_port_range(const struct net *net, int *low, int *high)
353377
{
354378
u32 range = READ_ONCE(net->ipv4.ip_local_ports.range);

net/ipv6/proc.c

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ static const struct snmp_mib snmp6_ipstats_list[] = {
8585
SNMP_MIB_ITEM("Ip6InECT0Pkts", IPSTATS_MIB_ECT0PKTS),
8686
SNMP_MIB_ITEM("Ip6InCEPkts", IPSTATS_MIB_CEPKTS),
8787
SNMP_MIB_ITEM("Ip6OutTransmits", IPSTATS_MIB_OUTPKTS),
88-
SNMP_MIB_SENTINEL
8988
};
9089

9190
static const struct snmp_mib snmp6_icmp6_list[] = {
@@ -96,7 +95,6 @@ static const struct snmp_mib snmp6_icmp6_list[] = {
9695
SNMP_MIB_ITEM("Icmp6OutErrors", ICMP6_MIB_OUTERRORS),
9796
SNMP_MIB_ITEM("Icmp6InCsumErrors", ICMP6_MIB_CSUMERRORS),
9897
SNMP_MIB_ITEM("Icmp6OutRateLimitHost", ICMP6_MIB_RATELIMITHOST),
99-
SNMP_MIB_SENTINEL
10098
};
10199

102100
/* RFC 4293 v6 ICMPMsgStatsTable; named items for RFC 2466 compatibility */
@@ -129,7 +127,6 @@ static const struct snmp_mib snmp6_udp6_list[] = {
129127
SNMP_MIB_ITEM("Udp6InCsumErrors", UDP_MIB_CSUMERRORS),
130128
SNMP_MIB_ITEM("Udp6IgnoredMulti", UDP_MIB_IGNOREDMULTI),
131129
SNMP_MIB_ITEM("Udp6MemErrors", UDP_MIB_MEMERRORS),
132-
SNMP_MIB_SENTINEL
133130
};
134131

135132
static const struct snmp_mib snmp6_udplite6_list[] = {
@@ -141,7 +138,6 @@ static const struct snmp_mib snmp6_udplite6_list[] = {
141138
SNMP_MIB_ITEM("UdpLite6SndbufErrors", UDP_MIB_SNDBUFERRORS),
142139
SNMP_MIB_ITEM("UdpLite6InCsumErrors", UDP_MIB_CSUMERRORS),
143140
SNMP_MIB_ITEM("UdpLite6MemErrors", UDP_MIB_MEMERRORS),
144-
SNMP_MIB_SENTINEL
145141
};
146142

147143
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)
182178
*/
183179
static void snmp6_seq_show_item(struct seq_file *seq, void __percpu *pcpumib,
184180
atomic_long_t *smib,
185-
const struct snmp_mib *itemlist)
181+
const struct snmp_mib *itemlist,
182+
int cnt)
186183
{
187184
unsigned long buff[SNMP_MIB_MAX];
188185
int i;
189186

190187
if (pcpumib) {
191-
memset(buff, 0, sizeof(unsigned long) * SNMP_MIB_MAX);
188+
memset(buff, 0, sizeof(unsigned long) * cnt);
192189

193-
snmp_get_cpu_field_batch(buff, itemlist, pcpumib);
194-
for (i = 0; itemlist[i].name; i++)
190+
snmp_get_cpu_field_batch_cnt(buff, itemlist, cnt, pcpumib);
191+
for (i = 0; i < cnt; i++)
195192
seq_printf(seq, "%-32s\t%lu\n",
196193
itemlist[i].name, buff[i]);
197194
} else {
198-
for (i = 0; itemlist[i].name; i++)
195+
for (i = 0; i < cnt; i++)
199196
seq_printf(seq, "%-32s\t%lu\n", itemlist[i].name,
200197
atomic_long_read(smib + itemlist[i].entry));
201198
}
202199
}
203200

204201
static void snmp6_seq_show_item64(struct seq_file *seq, void __percpu *mib,
205-
const struct snmp_mib *itemlist, size_t syncpoff)
202+
const struct snmp_mib *itemlist,
203+
int cnt, size_t syncpoff)
206204
{
207205
u64 buff64[SNMP_MIB_MAX];
208206
int i;
209207

210-
memset(buff64, 0, sizeof(u64) * SNMP_MIB_MAX);
208+
memset(buff64, 0, sizeof(u64) * cnt);
211209

212-
snmp_get_cpu_field64_batch(buff64, itemlist, mib, syncpoff);
213-
for (i = 0; itemlist[i].name; i++)
210+
snmp_get_cpu_field64_batch_cnt(buff64, itemlist, cnt, mib, syncpoff);
211+
for (i = 0; i < cnt; i++)
214212
seq_printf(seq, "%-32s\t%llu\n", itemlist[i].name, buff64[i]);
215213
}
216214

@@ -219,14 +217,19 @@ static int snmp6_seq_show(struct seq_file *seq, void *v)
219217
struct net *net = (struct net *)seq->private;
220218

221219
snmp6_seq_show_item64(seq, net->mib.ipv6_statistics,
222-
snmp6_ipstats_list, offsetof(struct ipstats_mib, syncp));
220+
snmp6_ipstats_list,
221+
ARRAY_SIZE(snmp6_ipstats_list),
222+
offsetof(struct ipstats_mib, syncp));
223223
snmp6_seq_show_item(seq, net->mib.icmpv6_statistics,
224-
NULL, snmp6_icmp6_list);
224+
NULL, snmp6_icmp6_list,
225+
ARRAY_SIZE(snmp6_icmp6_list));
225226
snmp6_seq_show_icmpv6msg(seq, net->mib.icmpv6msg_statistics->mibs);
226227
snmp6_seq_show_item(seq, net->mib.udp_stats_in6,
227-
NULL, snmp6_udp6_list);
228+
NULL, snmp6_udp6_list,
229+
ARRAY_SIZE(snmp6_udp6_list));
228230
snmp6_seq_show_item(seq, net->mib.udplite_stats_in6,
229-
NULL, snmp6_udplite6_list);
231+
NULL, snmp6_udplite6_list,
232+
ARRAY_SIZE(snmp6_udplite6_list));
230233
return 0;
231234
}
232235

@@ -236,9 +239,11 @@ static int snmp6_dev_seq_show(struct seq_file *seq, void *v)
236239

237240
seq_printf(seq, "%-32s\t%u\n", "ifIndex", idev->dev->ifindex);
238241
snmp6_seq_show_item64(seq, idev->stats.ipv6,
239-
snmp6_ipstats_list, offsetof(struct ipstats_mib, syncp));
242+
snmp6_ipstats_list,
243+
ARRAY_SIZE(snmp6_ipstats_list),
244+
offsetof(struct ipstats_mib, syncp));
240245
snmp6_seq_show_item(seq, NULL, idev->stats.icmpv6dev->mibs,
241-
snmp6_icmp6_list);
246+
snmp6_icmp6_list, ARRAY_SIZE(snmp6_icmp6_list));
242247
snmp6_seq_show_icmpv6msg(seq, idev->stats.icmpv6msgdev->mibs);
243248
return 0;
244249
}

0 commit comments

Comments
 (0)