diff options
Diffstat (limited to 'drivers/net/virtio_net.c')
| -rw-r--r-- | drivers/net/virtio_net.c | 19 | 
1 files changed, 12 insertions, 7 deletions
| diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 5214b1eceb95..f18149ae2588 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -42,7 +42,8 @@ module_param(gso, bool, 0444);  #define VIRTNET_DRIVER_VERSION "1.0.0"  struct virtnet_stats { -	struct u64_stats_sync syncp; +	struct u64_stats_sync tx_syncp; +	struct u64_stats_sync rx_syncp;  	u64 tx_bytes;  	u64 tx_packets; @@ -300,10 +301,10 @@ static void receive_buf(struct net_device *dev, void *buf, unsigned int len)  	hdr = skb_vnet_hdr(skb); -	u64_stats_update_begin(&stats->syncp); +	u64_stats_update_begin(&stats->rx_syncp);  	stats->rx_bytes += skb->len;  	stats->rx_packets++; -	u64_stats_update_end(&stats->syncp); +	u64_stats_update_end(&stats->rx_syncp);  	if (hdr->hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) {  		pr_debug("Needs csum!\n"); @@ -565,10 +566,10 @@ static unsigned int free_old_xmit_skbs(struct virtnet_info *vi)  	while ((skb = virtqueue_get_buf(vi->svq, &len)) != NULL) {  		pr_debug("Sent skb %p\n", skb); -		u64_stats_update_begin(&stats->syncp); +		u64_stats_update_begin(&stats->tx_syncp);  		stats->tx_bytes += skb->len;  		stats->tx_packets++; -		u64_stats_update_end(&stats->syncp); +		u64_stats_update_end(&stats->tx_syncp);  		tot_sgs += skb_vnet_hdr(skb)->num_sg;  		dev_kfree_skb_any(skb); @@ -703,12 +704,16 @@ static struct rtnl_link_stats64 *virtnet_stats(struct net_device *dev,  		u64 tpackets, tbytes, rpackets, rbytes;  		do { -			start = u64_stats_fetch_begin(&stats->syncp); +			start = u64_stats_fetch_begin(&stats->tx_syncp);  			tpackets = stats->tx_packets;  			tbytes   = stats->tx_bytes; +		} while (u64_stats_fetch_retry(&stats->tx_syncp, start)); + +		do { +			start = u64_stats_fetch_begin(&stats->rx_syncp);  			rpackets = stats->rx_packets;  			rbytes   = stats->rx_bytes; -		} while (u64_stats_fetch_retry(&stats->syncp, start)); +		} while (u64_stats_fetch_retry(&stats->rx_syncp, start));  		tot->rx_packets += rpackets;  		tot->tx_packets += tpackets; | 
