diff options
Diffstat (limited to 'net/ipv6/proc.c')
| -rw-r--r-- | net/ipv6/proc.c | 40 | 
1 files changed, 26 insertions, 14 deletions
diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c index 24b3558b8e6..18ff5df7ec0 100644 --- a/net/ipv6/proc.c +++ b/net/ipv6/proc.c @@ -141,7 +141,11 @@ static const struct snmp_mib snmp6_udplite6_list[] = {  	SNMP_MIB_SENTINEL  }; -static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void __percpu **mib) +/* can be called either with percpu mib (pcpumib != NULL), + * or shared one (smib != NULL) + */ +static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void __percpu **pcpumib, +				     atomic_long_t *smib)  {  	char name[32];  	int i; @@ -158,14 +162,14 @@ static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void __percpu **mib)  		snprintf(name, sizeof(name), "Icmp6%s%s",  			i & 0x100 ? "Out" : "In", p);  		seq_printf(seq, "%-32s\t%lu\n", name, -			snmp_fold_field(mib, i)); +			pcpumib ? snmp_fold_field(pcpumib, i) : atomic_long_read(smib + i));  	}  	/* print by number (nonzero only) - ICMPMsgStat format */  	for (i = 0; i < ICMP6MSG_MIB_MAX; i++) {  		unsigned long val; -		val = snmp_fold_field(mib, i); +		val = pcpumib ? snmp_fold_field(pcpumib, i) : atomic_long_read(smib + i);  		if (!val)  			continue;  		snprintf(name, sizeof(name), "Icmp6%sType%u", @@ -174,14 +178,22 @@ static void snmp6_seq_show_icmpv6msg(struct seq_file *seq, void __percpu **mib)  	}  } -static void snmp6_seq_show_item(struct seq_file *seq, void __percpu **mib, +/* can be called either with percpu mib (pcpumib != NULL), + * or shared one (smib != NULL) + */ +static void snmp6_seq_show_item(struct seq_file *seq, void __percpu **pcpumib, +				atomic_long_t *smib,  				const struct snmp_mib *itemlist)  {  	int i; +	unsigned long val; -	for (i = 0; itemlist[i].name; i++) -		seq_printf(seq, "%-32s\t%lu\n", itemlist[i].name, -			   snmp_fold_field(mib, itemlist[i].entry)); +	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); +	}  }  static void snmp6_seq_show_item64(struct seq_file *seq, void __percpu **mib, @@ -201,13 +213,13 @@ static int snmp6_seq_show(struct seq_file *seq, void *v)  	snmp6_seq_show_item64(seq, (void __percpu **)net->mib.ipv6_statistics,  			    snmp6_ipstats_list, offsetof(struct ipstats_mib, syncp));  	snmp6_seq_show_item(seq, (void __percpu **)net->mib.icmpv6_statistics, -			    snmp6_icmp6_list); +			    NULL, snmp6_icmp6_list);  	snmp6_seq_show_icmpv6msg(seq, -			    (void __percpu **)net->mib.icmpv6msg_statistics); +			    (void __percpu **)net->mib.icmpv6msg_statistics, NULL);  	snmp6_seq_show_item(seq, (void __percpu **)net->mib.udp_stats_in6, -			    snmp6_udp6_list); +			    NULL, snmp6_udp6_list);  	snmp6_seq_show_item(seq, (void __percpu **)net->mib.udplite_stats_in6, -			    snmp6_udplite6_list); +			    NULL, snmp6_udplite6_list);  	return 0;  } @@ -229,11 +241,11 @@ 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_item(seq, (void __percpu **)idev->stats.ipv6, +	snmp6_seq_show_item(seq, (void __percpu **)idev->stats.ipv6, NULL,  			    snmp6_ipstats_list); -	snmp6_seq_show_item(seq, (void __percpu **)idev->stats.icmpv6, +	snmp6_seq_show_item(seq, NULL, idev->stats.icmpv6dev->mibs,  			    snmp6_icmp6_list); -	snmp6_seq_show_icmpv6msg(seq, (void __percpu **)idev->stats.icmpv6msg); +	snmp6_seq_show_icmpv6msg(seq, NULL, idev->stats.icmpv6msgdev->mibs);  	return 0;  }  |