aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/virtio_net.c
diff options
context:
space:
mode:
authorJason Wang <jasowang@redhat.com>2013-10-14 23:18:59 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-11-04 07:31:03 -0500
commit30983d3c66572348f078fe2e2d55638d73c3e486 (patch)
tree2445123c37de70924273083fc1d4e4c81c56a5c0 /drivers/net/virtio_net.c
parent413054e740f1efb2cb765323bc73ad01f986c4e1 (diff)
virtio-net: refill only when device is up during setting queues
[ Upstream commit 35ed159bfd96a7547ec277ed8b550c7cbd9841b6 ] We used to schedule the refill work unconditionally after changing the number of queues. This may lead an issue if the device is not up. Since we only try to cancel the work in ndo_stop(), this may cause the refill work still work after removing the device. Fix this by only schedule the work when device is up. The bug were introduce by commit 9b9cd8024a2882e896c65222aa421d461354e3f2. (virtio-net: fix the race between channels setting and refill) Signed-off-by: Jason Wang <jasowang@redhat.com> Cc: Rusty Russell <rusty@rustcorp.com.au> Cc: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/net/virtio_net.c')
-rw-r--r--drivers/net/virtio_net.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 43a71d911b1c..1d01534c2020 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -916,7 +916,9 @@ static int virtnet_set_queues(struct virtnet_info *vi, u16 queue_pairs)
916 return -EINVAL; 916 return -EINVAL;
917 } else { 917 } else {
918 vi->curr_queue_pairs = queue_pairs; 918 vi->curr_queue_pairs = queue_pairs;
919 schedule_delayed_work(&vi->refill, 0); 919 /* virtnet_open() will refill when device is going to up. */
920 if (dev->flags & IFF_UP)
921 schedule_delayed_work(&vi->refill, 0);
920 } 922 }
921 923
922 return 0; 924 return 0;
@@ -1714,7 +1716,9 @@ static int virtnet_restore(struct virtio_device *vdev)
1714 vi->config_enable = true; 1716 vi->config_enable = true;
1715 mutex_unlock(&vi->config_lock); 1717 mutex_unlock(&vi->config_lock);
1716 1718
1719 rtnl_lock();
1717 virtnet_set_queues(vi, vi->curr_queue_pairs); 1720 virtnet_set_queues(vi, vi->curr_queue_pairs);
1721 rtnl_unlock();
1718 1722
1719 return 0; 1723 return 0;
1720} 1724}