diff options
Diffstat (limited to 'net/ipv6/proc.c')
| -rw-r--r-- | net/ipv6/proc.c | 30 | 
1 files changed, 22 insertions, 8 deletions
diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c index 679253d0af84..cc8e3ae9ca73 100644 --- a/net/ipv6/proc.c +++ b/net/ipv6/proc.c @@ -30,6 +30,11 @@  #include <net/transp_v6.h>  #include <net/ipv6.h> +#define MAX4(a, b, c, d) \ +	max_t(u32, max_t(u32, a, b), max_t(u32, c, d)) +#define SNMP_MIB_MAX MAX4(UDP_MIB_MAX, TCP_MIB_MAX, \ +			IPSTATS_MIB_MAX, ICMP_MIB_MAX) +  static int sockstat6_seq_show(struct seq_file *seq, void *v)  {  	struct net *net = seq->private; @@ -191,25 +196,34 @@ static void snmp6_seq_show_item(struct seq_file *seq, void __percpu *pcpumib,  				atomic_long_t *smib,  				const struct snmp_mib *itemlist)  { +	unsigned long buff[SNMP_MIB_MAX];  	int i; -	unsigned long val; -	for (i = 0; itemlist[i].name; i++) { -		val = pcpumib ? -			snmp_fold_field(pcpumib, itemlist[i].entry) : -			atomic_long_read(smib + itemlist[i].entry); -		seq_printf(seq, "%-32s\t%lu\n", itemlist[i].name, val); +	if (pcpumib) { +		memset(buff, 0, sizeof(unsigned long) * SNMP_MIB_MAX); + +		snmp_get_cpu_field_batch(buff, itemlist, pcpumib); +		for (i = 0; itemlist[i].name; i++) +			seq_printf(seq, "%-32s\t%lu\n", +				   itemlist[i].name, buff[i]); +	} else { +		for (i = 0; itemlist[i].name; 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)  { +	u64 buff64[SNMP_MIB_MAX];  	int i; +	memset(buff64, 0, sizeof(unsigned long) * SNMP_MIB_MAX); + +	snmp_get_cpu_field64_batch(buff64, itemlist, mib, syncpoff);  	for (i = 0; itemlist[i].name; i++) -		seq_printf(seq, "%-32s\t%llu\n", itemlist[i].name, -			   snmp_fold_field64(mib, itemlist[i].entry, syncpoff)); +		seq_printf(seq, "%-32s\t%llu\n", itemlist[i].name, buff64[i]);  }  static int snmp6_seq_show(struct seq_file *seq, void *v)  |