net: clean up snmp stats code
commit8f0ea0fe3a
(snmp: reduce percpu needs by 50%) reduced snmp array size to 1, so technically it doesn't have to be an array any more. What's more, after the following commit: commit933393f58f
Date: Thu Dec 22 11:58:51 2011 -0600 percpu: Remove irqsafe_cpu_xxx variants We simply say that regular this_cpu use must be safe regardless of preemption and interrupt state. That has no material change for x86 and s390 implementations of this_cpu operations. However, arches that do not provide their own implementation for this_cpu operations will now get code generated that disables interrupts instead of preemption. probably no arch wants to have SNMP_ARRAY_SZ == 2. At least after almost 3 years, no one complains. So, just convert the array to a single pointer and remove snmp_mib_init() and snmp_mib_free() as well. Cc: Christoph Lameter <cl@linux.com> Cc: Eric Dumazet <eric.dumazet@gmail.com> Cc: David S. Miller <davem@davemloft.net> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
d1f88a667c
commit
698365fa18
@@ -275,19 +275,14 @@ static int snmp6_alloc_dev(struct inet6_dev *idev)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (snmp_mib_init((void __percpu **)idev->stats.ipv6,
|
||||
sizeof(struct ipstats_mib),
|
||||
__alignof__(struct ipstats_mib)) < 0)
|
||||
idev->stats.ipv6 = alloc_percpu(struct ipstats_mib);
|
||||
if (!idev->stats.ipv6)
|
||||
goto err_ip;
|
||||
|
||||
for_each_possible_cpu(i) {
|
||||
struct ipstats_mib *addrconf_stats;
|
||||
addrconf_stats = per_cpu_ptr(idev->stats.ipv6[0], i);
|
||||
addrconf_stats = per_cpu_ptr(idev->stats.ipv6, i);
|
||||
u64_stats_init(&addrconf_stats->syncp);
|
||||
#if SNMP_ARRAY_SZ == 2
|
||||
addrconf_stats = per_cpu_ptr(idev->stats.ipv6[1], i);
|
||||
u64_stats_init(&addrconf_stats->syncp);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -305,7 +300,7 @@ static int snmp6_alloc_dev(struct inet6_dev *idev)
|
||||
err_icmpmsg:
|
||||
kfree(idev->stats.icmpv6dev);
|
||||
err_icmp:
|
||||
snmp_mib_free((void __percpu **)idev->stats.ipv6);
|
||||
free_percpu(idev->stats.ipv6);
|
||||
err_ip:
|
||||
return -ENOMEM;
|
||||
}
|
||||
@@ -4363,7 +4358,7 @@ static inline void __snmp6_fill_statsdev(u64 *stats, atomic_long_t *mib,
|
||||
memset(&stats[items], 0, pad);
|
||||
}
|
||||
|
||||
static inline void __snmp6_fill_stats64(u64 *stats, void __percpu **mib,
|
||||
static inline void __snmp6_fill_stats64(u64 *stats, void __percpu *mib,
|
||||
int items, int bytes, size_t syncpoff)
|
||||
{
|
||||
int i;
|
||||
@@ -4383,7 +4378,7 @@ static void snmp6_fill_stats(u64 *stats, struct inet6_dev *idev, int attrtype,
|
||||
{
|
||||
switch (attrtype) {
|
||||
case IFLA_INET6_STATS:
|
||||
__snmp6_fill_stats64(stats, (void __percpu **)idev->stats.ipv6,
|
||||
__snmp6_fill_stats64(stats, idev->stats.ipv6,
|
||||
IPSTATS_MIB_MAX, bytes, offsetof(struct ipstats_mib, syncp));
|
||||
break;
|
||||
case IFLA_INET6_ICMP6STATS:
|
||||
|
@@ -123,7 +123,7 @@ static void snmp6_free_dev(struct inet6_dev *idev)
|
||||
{
|
||||
kfree(idev->stats.icmpv6msgdev);
|
||||
kfree(idev->stats.icmpv6dev);
|
||||
snmp_mib_free((void __percpu **)idev->stats.ipv6);
|
||||
free_percpu(idev->stats.ipv6);
|
||||
}
|
||||
|
||||
/* Nobody refers to this device, we may destroy it. */
|
||||
|
@@ -715,33 +715,25 @@ static int __net_init ipv6_init_mibs(struct net *net)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (snmp_mib_init((void __percpu **)net->mib.udp_stats_in6,
|
||||
sizeof(struct udp_mib),
|
||||
__alignof__(struct udp_mib)) < 0)
|
||||
net->mib.udp_stats_in6 = alloc_percpu(struct udp_mib);
|
||||
if (!net->mib.udp_stats_in6)
|
||||
return -ENOMEM;
|
||||
if (snmp_mib_init((void __percpu **)net->mib.udplite_stats_in6,
|
||||
sizeof(struct udp_mib),
|
||||
__alignof__(struct udp_mib)) < 0)
|
||||
net->mib.udplite_stats_in6 = alloc_percpu(struct udp_mib);
|
||||
if (!net->mib.udplite_stats_in6)
|
||||
goto err_udplite_mib;
|
||||
if (snmp_mib_init((void __percpu **)net->mib.ipv6_statistics,
|
||||
sizeof(struct ipstats_mib),
|
||||
__alignof__(struct ipstats_mib)) < 0)
|
||||
net->mib.ipv6_statistics = alloc_percpu(struct ipstats_mib);
|
||||
if (!net->mib.ipv6_statistics)
|
||||
goto err_ip_mib;
|
||||
|
||||
for_each_possible_cpu(i) {
|
||||
struct ipstats_mib *af_inet6_stats;
|
||||
af_inet6_stats = per_cpu_ptr(net->mib.ipv6_statistics[0], i);
|
||||
af_inet6_stats = per_cpu_ptr(net->mib.ipv6_statistics, i);
|
||||
u64_stats_init(&af_inet6_stats->syncp);
|
||||
#if SNMP_ARRAY_SZ == 2
|
||||
af_inet6_stats = per_cpu_ptr(net->mib.ipv6_statistics[1], i);
|
||||
u64_stats_init(&af_inet6_stats->syncp);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
if (snmp_mib_init((void __percpu **)net->mib.icmpv6_statistics,
|
||||
sizeof(struct icmpv6_mib),
|
||||
__alignof__(struct icmpv6_mib)) < 0)
|
||||
net->mib.icmpv6_statistics = alloc_percpu(struct icmpv6_mib);
|
||||
if (!net->mib.icmpv6_statistics)
|
||||
goto err_icmp_mib;
|
||||
net->mib.icmpv6msg_statistics = kzalloc(sizeof(struct icmpv6msg_mib),
|
||||
GFP_KERNEL);
|
||||
@@ -750,22 +742,22 @@ static int __net_init ipv6_init_mibs(struct net *net)
|
||||
return 0;
|
||||
|
||||
err_icmpmsg_mib:
|
||||
snmp_mib_free((void __percpu **)net->mib.icmpv6_statistics);
|
||||
free_percpu(net->mib.icmpv6_statistics);
|
||||
err_icmp_mib:
|
||||
snmp_mib_free((void __percpu **)net->mib.ipv6_statistics);
|
||||
free_percpu(net->mib.ipv6_statistics);
|
||||
err_ip_mib:
|
||||
snmp_mib_free((void __percpu **)net->mib.udplite_stats_in6);
|
||||
free_percpu(net->mib.udplite_stats_in6);
|
||||
err_udplite_mib:
|
||||
snmp_mib_free((void __percpu **)net->mib.udp_stats_in6);
|
||||
free_percpu(net->mib.udp_stats_in6);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void ipv6_cleanup_mibs(struct net *net)
|
||||
{
|
||||
snmp_mib_free((void __percpu **)net->mib.udp_stats_in6);
|
||||
snmp_mib_free((void __percpu **)net->mib.udplite_stats_in6);
|
||||
snmp_mib_free((void __percpu **)net->mib.ipv6_statistics);
|
||||
snmp_mib_free((void __percpu **)net->mib.icmpv6_statistics);
|
||||
free_percpu(net->mib.udp_stats_in6);
|
||||
free_percpu(net->mib.udplite_stats_in6);
|
||||
free_percpu(net->mib.ipv6_statistics);
|
||||
free_percpu(net->mib.icmpv6_statistics);
|
||||
kfree(net->mib.icmpv6msg_statistics);
|
||||
}
|
||||
|
||||
|
@@ -201,7 +201,7 @@ static void snmp6_seq_show_item(struct seq_file *seq, void __percpu **pcpumib,
|
||||
}
|
||||
}
|
||||
|
||||
static void snmp6_seq_show_item64(struct seq_file *seq, void __percpu **mib,
|
||||
static void snmp6_seq_show_item64(struct seq_file *seq, void __percpu *mib,
|
||||
const struct snmp_mib *itemlist, size_t syncpoff)
|
||||
{
|
||||
int i;
|
||||
@@ -215,7 +215,7 @@ static int snmp6_seq_show(struct seq_file *seq, void *v)
|
||||
{
|
||||
struct net *net = (struct net *)seq->private;
|
||||
|
||||
snmp6_seq_show_item64(seq, (void __percpu **)net->mib.ipv6_statistics,
|
||||
snmp6_seq_show_item64(seq, net->mib.ipv6_statistics,
|
||||
snmp6_ipstats_list, offsetof(struct ipstats_mib, syncp));
|
||||
snmp6_seq_show_item(seq, (void __percpu **)net->mib.icmpv6_statistics,
|
||||
NULL, snmp6_icmp6_list);
|
||||
@@ -245,7 +245,7 @@ static int snmp6_dev_seq_show(struct seq_file *seq, void *v)
|
||||
struct inet6_dev *idev = (struct inet6_dev *)seq->private;
|
||||
|
||||
seq_printf(seq, "%-32s\t%u\n", "ifIndex", idev->dev->ifindex);
|
||||
snmp6_seq_show_item64(seq, (void __percpu **)idev->stats.ipv6,
|
||||
snmp6_seq_show_item64(seq, idev->stats.ipv6,
|
||||
snmp6_ipstats_list, offsetof(struct ipstats_mib, syncp));
|
||||
snmp6_seq_show_item(seq, NULL, idev->stats.icmpv6dev->mibs,
|
||||
snmp6_icmp6_list);
|
||||
|
Reference in New Issue
Block a user