diff options
Diffstat (limited to 'net/ipv6/addrconf.c')
-rw-r--r-- | net/ipv6/addrconf.c | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index f2f9b2e3cfe9..3cfbbf3387a0 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -289,19 +289,19 @@ static int snmp6_alloc_dev(struct inet6_dev *idev) | |||
289 | sizeof(struct ipstats_mib), | 289 | sizeof(struct ipstats_mib), |
290 | __alignof__(struct ipstats_mib)) < 0) | 290 | __alignof__(struct ipstats_mib)) < 0) |
291 | goto err_ip; | 291 | goto err_ip; |
292 | if (snmp_mib_init((void __percpu **)idev->stats.icmpv6, | 292 | idev->stats.icmpv6dev = kzalloc(sizeof(struct icmpv6_mib_device), |
293 | sizeof(struct icmpv6_mib), | 293 | GFP_KERNEL); |
294 | __alignof__(struct icmpv6_mib)) < 0) | 294 | if (!idev->stats.icmpv6dev) |
295 | goto err_icmp; | 295 | goto err_icmp; |
296 | if (snmp_mib_init((void __percpu **)idev->stats.icmpv6msg, | 296 | idev->stats.icmpv6msgdev = kzalloc(sizeof(struct icmpv6msg_mib_device), |
297 | sizeof(struct icmpv6msg_mib), | 297 | GFP_KERNEL); |
298 | __alignof__(struct icmpv6msg_mib)) < 0) | 298 | if (!idev->stats.icmpv6msgdev) |
299 | goto err_icmpmsg; | 299 | goto err_icmpmsg; |
300 | 300 | ||
301 | return 0; | 301 | return 0; |
302 | 302 | ||
303 | err_icmpmsg: | 303 | err_icmpmsg: |
304 | snmp_mib_free((void __percpu **)idev->stats.icmpv6); | 304 | kfree(idev->stats.icmpv6dev); |
305 | err_icmp: | 305 | err_icmp: |
306 | snmp_mib_free((void __percpu **)idev->stats.ipv6); | 306 | snmp_mib_free((void __percpu **)idev->stats.ipv6); |
307 | err_ip: | 307 | err_ip: |
@@ -310,8 +310,8 @@ err_ip: | |||
310 | 310 | ||
311 | static void snmp6_free_dev(struct inet6_dev *idev) | 311 | static void snmp6_free_dev(struct inet6_dev *idev) |
312 | { | 312 | { |
313 | snmp_mib_free((void __percpu **)idev->stats.icmpv6msg); | 313 | kfree(idev->stats.icmpv6msgdev); |
314 | snmp_mib_free((void __percpu **)idev->stats.icmpv6); | 314 | kfree(idev->stats.icmpv6dev); |
315 | snmp_mib_free((void __percpu **)idev->stats.ipv6); | 315 | snmp_mib_free((void __percpu **)idev->stats.ipv6); |
316 | } | 316 | } |
317 | 317 | ||
@@ -3838,7 +3838,7 @@ static inline size_t inet6_if_nlmsg_size(void) | |||
3838 | + nla_total_size(inet6_ifla6_size()); /* IFLA_PROTINFO */ | 3838 | + nla_total_size(inet6_ifla6_size()); /* IFLA_PROTINFO */ |
3839 | } | 3839 | } |
3840 | 3840 | ||
3841 | static inline void __snmp6_fill_stats(u64 *stats, void __percpu **mib, | 3841 | static inline void __snmp6_fill_statsdev(u64 *stats, atomic_long_t *mib, |
3842 | int items, int bytes) | 3842 | int items, int bytes) |
3843 | { | 3843 | { |
3844 | int i; | 3844 | int i; |
@@ -3848,7 +3848,7 @@ static inline void __snmp6_fill_stats(u64 *stats, void __percpu **mib, | |||
3848 | /* Use put_unaligned() because stats may not be aligned for u64. */ | 3848 | /* Use put_unaligned() because stats may not be aligned for u64. */ |
3849 | put_unaligned(items, &stats[0]); | 3849 | put_unaligned(items, &stats[0]); |
3850 | for (i = 1; i < items; i++) | 3850 | for (i = 1; i < items; i++) |
3851 | put_unaligned(snmp_fold_field(mib, i), &stats[i]); | 3851 | put_unaligned(atomic_long_read(&mib[i]), &stats[i]); |
3852 | 3852 | ||
3853 | memset(&stats[items], 0, pad); | 3853 | memset(&stats[items], 0, pad); |
3854 | } | 3854 | } |
@@ -3877,7 +3877,7 @@ static void snmp6_fill_stats(u64 *stats, struct inet6_dev *idev, int attrtype, | |||
3877 | IPSTATS_MIB_MAX, bytes, offsetof(struct ipstats_mib, syncp)); | 3877 | IPSTATS_MIB_MAX, bytes, offsetof(struct ipstats_mib, syncp)); |
3878 | break; | 3878 | break; |
3879 | case IFLA_INET6_ICMP6STATS: | 3879 | case IFLA_INET6_ICMP6STATS: |
3880 | __snmp6_fill_stats(stats, (void __percpu **)idev->stats.icmpv6, ICMP6_MIB_MAX, bytes); | 3880 | __snmp6_fill_statsdev(stats, idev->stats.icmpv6dev->mibs, ICMP6_MIB_MAX, bytes); |
3881 | break; | 3881 | break; |
3882 | } | 3882 | } |
3883 | } | 3883 | } |