diff options
Diffstat (limited to 'drivers/net/virtio_net.c')
| -rw-r--r-- | drivers/net/virtio_net.c | 26 | 
1 files changed, 13 insertions, 13 deletions
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 9ce6995e8d0..83d2b0c34c5 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_bh(&stats->tx_syncp);  			tpackets = stats->tx_packets;  			tbytes   = stats->tx_bytes; +		} while (u64_stats_fetch_retry_bh(&stats->tx_syncp, start)); + +		do { +			start = u64_stats_fetch_begin_bh(&stats->rx_syncp);  			rpackets = stats->rx_packets;  			rbytes   = stats->rx_bytes; -		} while (u64_stats_fetch_retry(&stats->syncp, start)); +		} while (u64_stats_fetch_retry_bh(&stats->rx_syncp, start));  		tot->rx_packets += rpackets;  		tot->tx_packets += tpackets; @@ -1057,7 +1062,7 @@ static int virtnet_probe(struct virtio_device *vdev)  		return -ENOMEM;  	/* Set up network device as normal. */ -	dev->priv_flags |= IFF_UNICAST_FLT; +	dev->priv_flags |= IFF_UNICAST_FLT | IFF_LIVE_ADDR_CHANGE;  	dev->netdev_ops = &virtnet_netdev;  	dev->features = NETIF_F_HIGHDMA; @@ -1231,11 +1236,6 @@ static int virtnet_freeze(struct virtio_device *vdev)  	vi->config_enable = false;  	mutex_unlock(&vi->config_lock); -	virtqueue_disable_cb(vi->rvq); -	virtqueue_disable_cb(vi->svq); -	if (virtio_has_feature(vi->vdev, VIRTIO_NET_F_CTRL_VQ)) -		virtqueue_disable_cb(vi->cvq); -  	netif_device_detach(vi->dev);  	cancel_delayed_work_sync(&vi->refill);  |