aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAke Koomsin <ake@igel.co.jp>2018-10-17 06:44:12 -0400
committerDavid S. Miller <davem@davemloft.net>2018-10-18 01:29:30 -0400
commit05c998b738fdd3e5d6a257bcacc8f34b6284d795 (patch)
tree07d022a2799373d700ce72650a95b51c7af70bf8
parent84dad55951b0d009372ec21760b650634246e144 (diff)
virtio_net: avoid using netif_tx_disable() for serializing tx routine
Commit 713a98d90c5e ("virtio-net: serialize tx routine during reset") introduces netif_tx_disable() after netif_device_detach() in order to avoid use-after-free of tx queues. However, there are two issues. 1) Its operation is redundant with netif_device_detach() in case the interface is running. 2) In case of the interface is not running before suspending and resuming, the tx does not get resumed by netif_device_attach(). This results in losing network connectivity. It is better to use netif_tx_lock_bh()/netif_tx_unlock_bh() instead for serializing tx routine during reset. This also preserves the symmetry of netif_device_detach() and netif_device_attach(). Fixes commit 713a98d90c5e ("virtio-net: serialize tx routine during reset") Signed-off-by: Ake Koomsin <ake@igel.co.jp> Acked-by: Jason Wang <jasowang@redhat.com> Acked-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/virtio_net.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index dab504ec5e50..ddfa3f24204c 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -2218,8 +2218,9 @@ static void virtnet_freeze_down(struct virtio_device *vdev)
2218 /* Make sure no work handler is accessing the device */ 2218 /* Make sure no work handler is accessing the device */
2219 flush_work(&vi->config_work); 2219 flush_work(&vi->config_work);
2220 2220
2221 netif_tx_lock_bh(vi->dev);
2221 netif_device_detach(vi->dev); 2222 netif_device_detach(vi->dev);
2222 netif_tx_disable(vi->dev); 2223 netif_tx_unlock_bh(vi->dev);
2223 cancel_delayed_work_sync(&vi->refill); 2224 cancel_delayed_work_sync(&vi->refill);
2224 2225
2225 if (netif_running(vi->dev)) { 2226 if (netif_running(vi->dev)) {
@@ -2255,7 +2256,9 @@ static int virtnet_restore_up(struct virtio_device *vdev)
2255 } 2256 }
2256 } 2257 }
2257 2258
2259 netif_tx_lock_bh(vi->dev);
2258 netif_device_attach(vi->dev); 2260 netif_device_attach(vi->dev);
2261 netif_tx_unlock_bh(vi->dev);
2259 return err; 2262 return err;
2260} 2263}
2261 2264