diff options
| author | Igor Druzhinin <igor.druzhinin@citrix.com> | 2017-01-17 20:49:38 +0000 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2017-01-18 15:11:20 -0500 | 
| commit | f16f1df65f1cf139ff9e9f84661e6573d6bb27fc (patch) | |
| tree | 6f3d46c2653ace73426558feacde02c97c7adbeb /drivers/net/xen-netback/interface.c | |
| parent | 9a6cdf52b85ea5fb21d2bb31e4a7bc61b79923a7 (diff) | |
| download | blackbird-op-linux-f16f1df65f1cf139ff9e9f84661e6573d6bb27fc.tar.gz blackbird-op-linux-f16f1df65f1cf139ff9e9f84661e6573d6bb27fc.zip | |
xen-netback: protect resource cleaning on XenBus disconnect
vif->lock is used to protect statistics gathering agents from using the
queue structure during cleaning.
Signed-off-by: Igor Druzhinin <igor.druzhinin@citrix.com>
Acked-by: Wei Liu <wei.liu2@citrix.com>
Reviewed-by: Paul Durrant <paul.durrant@citrix.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/xen-netback/interface.c')
| -rw-r--r-- | drivers/net/xen-netback/interface.c | 6 | 
1 files changed, 4 insertions, 2 deletions
| diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c index e30ffd29b7e9..579521327b03 100644 --- a/drivers/net/xen-netback/interface.c +++ b/drivers/net/xen-netback/interface.c @@ -221,18 +221,18 @@ static struct net_device_stats *xenvif_get_stats(struct net_device *dev)  {  	struct xenvif *vif = netdev_priv(dev);  	struct xenvif_queue *queue = NULL; -	unsigned int num_queues = vif->num_queues;  	unsigned long rx_bytes = 0;  	unsigned long rx_packets = 0;  	unsigned long tx_bytes = 0;  	unsigned long tx_packets = 0;  	unsigned int index; +	spin_lock(&vif->lock);  	if (vif->queues == NULL)  		goto out;  	/* Aggregate tx and rx stats from each queue */ -	for (index = 0; index < num_queues; ++index) { +	for (index = 0; index < vif->num_queues; ++index) {  		queue = &vif->queues[index];  		rx_bytes += queue->stats.rx_bytes;  		rx_packets += queue->stats.rx_packets; @@ -241,6 +241,8 @@ static struct net_device_stats *xenvif_get_stats(struct net_device *dev)  	}  out: +	spin_unlock(&vif->lock); +  	vif->dev->stats.rx_bytes = rx_bytes;  	vif->dev->stats.rx_packets = rx_packets;  	vif->dev->stats.tx_bytes = tx_bytes; | 

