Message ID | 20150829025715.GA5546@linux.vnet.ibm.com |
---|---|
State | RFC, archived |
Delegated to: | David Miller |
Headers | show |
On Sat, 2015-08-29 at 08:27 +0530, Raghavendra K T wrote: > > /* Use put_unaligned() because stats may not be aligned for u64. */ > put_unaligned(items, &stats[0]); > for (i = 1; i < items; i++) > - put_unaligned(snmp_fold_field64(mib, i, syncpoff), &stats[i]); > + put_unaligned(buff[i], &stats[i]); > I believe Joe suggested following code instead : buff[0] = items; memcpy(stats, buff, items * sizeof(u64)); Also please move buff[] array into __snmp6_fill_stats64() to make it clear it is used in a 'leaf' function. (even if calling memcpy()/memset() makes it not a leaf function) -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com> Date: Sat, 29 Aug 2015 08:27:15 +0530 > resending the patch with memset. Please let me know if you want to > resend all the patches. Do not post patches as replies to existing discussion threads. Instead, make a new, fresh, patch posting, updating the Subject line as needed. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 08/29/2015 08:56 AM, Eric Dumazet wrote: > On Sat, 2015-08-29 at 08:27 +0530, Raghavendra K T wrote: >> >> /* Use put_unaligned() because stats may not be aligned for u64. */ >> put_unaligned(items, &stats[0]); > > >> for (i = 1; i < items; i++) >> - put_unaligned(snmp_fold_field64(mib, i, syncpoff), &stats[i]); >> + put_unaligned(buff[i], &stats[i]); >> > > I believe Joe suggested following code instead : > > buff[0] = items; > memcpy(stats, buff, items * sizeof(u64)); Thanks. Sure, will use this. (I missed that. I thought that it was applicable only when we have aligned data,and for power, put_aunaligned was not a nop unlike intel). > > Also please move buff[] array into __snmp6_fill_stats64() to make it > clear it is used in a 'leaf' function. Correct. > > (even if calling memcpy()/memset() makes it not a leaf function) > -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 08/29/2015 10:41 AM, David Miller wrote: > From: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com> > Date: Sat, 29 Aug 2015 08:27:15 +0530 > >> resending the patch with memset. Please let me know if you want to >> resend all the patches. > > Do not post patches as replies to existing discussion threads. > > Instead, make a new, fresh, patch posting, updating the Subject line > as needed. > Sure. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 21c2c81..9bdfba3 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -4624,16 +4624,22 @@ static inline void __snmp6_fill_statsdev(u64 *stats, atomic_long_t *mib, } static inline void __snmp6_fill_stats64(u64 *stats, void __percpu *mib, - int items, int bytes, size_t syncpoff) + int items, int bytes, size_t syncpoff, + u64 *buff) { - int i; + int i, c; int pad = bytes - sizeof(u64) * items; BUG_ON(pad < 0); /* Use put_unaligned() because stats may not be aligned for u64. */ put_unaligned(items, &stats[0]); + + for_each_possible_cpu(c) + for (i = 1; i < items; i++) + buff[i] += snmp_get_cpu_field64(mib, c, i, syncpoff); + for (i = 1; i < items; i++) - put_unaligned(snmp_fold_field64(mib, i, syncpoff), &stats[i]); + put_unaligned(buff[i], &stats[i]); memset(&stats[items], 0, pad); } @@ -4641,10 +4647,13 @@ static inline void __snmp6_fill_stats64(u64 *stats, void __percpu *mib, static void snmp6_fill_stats(u64 *stats, struct inet6_dev *idev, int attrtype, int bytes) { + u64 buff[IPSTATS_MIB_MAX]; + switch (attrtype) { case IFLA_INET6_STATS: - __snmp6_fill_stats64(stats, idev->stats.ipv6, - IPSTATS_MIB_MAX, bytes, offsetof(struct ipstats_mib, syncp)); + memset(buff, 0, sizeof(buff)); + __snmp6_fill_stats64(stats, idev->stats.ipv6, IPSTATS_MIB_MAX, bytes, + offsetof(struct ipstats_mib, syncp), buff); break; case IFLA_INET6_ICMP6STATS: __snmp6_fill_statsdev(stats, idev->stats.icmpv6dev->mibs, ICMP6_MIB_MAX, bytes);