aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/virtio_net.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/virtio_net.c')
-rw-r--r--drivers/net/virtio_net.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 916241d16c67..5d776447d9c3 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -426,10 +426,10 @@ static void receive_buf(struct receive_queue *rq, void *buf, unsigned int len)
426 if (unlikely(len < sizeof(struct virtio_net_hdr) + ETH_HLEN)) { 426 if (unlikely(len < sizeof(struct virtio_net_hdr) + ETH_HLEN)) {
427 pr_debug("%s: short packet %i\n", dev->name, len); 427 pr_debug("%s: short packet %i\n", dev->name, len);
428 dev->stats.rx_length_errors++; 428 dev->stats.rx_length_errors++;
429 if (vi->big_packets) 429 if (vi->mergeable_rx_bufs)
430 give_pages(rq, buf);
431 else if (vi->mergeable_rx_bufs)
432 put_page(virt_to_head_page(buf)); 430 put_page(virt_to_head_page(buf));
431 else if (vi->big_packets)
432 give_pages(rq, buf);
433 else 433 else
434 dev_kfree_skb(buf); 434 dev_kfree_skb(buf);
435 return; 435 return;
@@ -1367,6 +1367,11 @@ static void virtnet_config_changed(struct virtio_device *vdev)
1367 1367
1368static void virtnet_free_queues(struct virtnet_info *vi) 1368static void virtnet_free_queues(struct virtnet_info *vi)
1369{ 1369{
1370 int i;
1371
1372 for (i = 0; i < vi->max_queue_pairs; i++)
1373 netif_napi_del(&vi->rq[i].napi);
1374
1370 kfree(vi->rq); 1375 kfree(vi->rq);
1371 kfree(vi->sq); 1376 kfree(vi->sq);
1372} 1377}
@@ -1396,10 +1401,10 @@ static void free_unused_bufs(struct virtnet_info *vi)
1396 struct virtqueue *vq = vi->rq[i].vq; 1401 struct virtqueue *vq = vi->rq[i].vq;
1397 1402
1398 while ((buf = virtqueue_detach_unused_buf(vq)) != NULL) { 1403 while ((buf = virtqueue_detach_unused_buf(vq)) != NULL) {
1399 if (vi->big_packets) 1404 if (vi->mergeable_rx_bufs)
1400 give_pages(&vi->rq[i], buf);
1401 else if (vi->mergeable_rx_bufs)
1402 put_page(virt_to_head_page(buf)); 1405 put_page(virt_to_head_page(buf));
1406 else if (vi->big_packets)
1407 give_pages(&vi->rq[i], buf);
1403 else 1408 else
1404 dev_kfree_skb(buf); 1409 dev_kfree_skb(buf);
1405 --vi->rq[i].num; 1410 --vi->rq[i].num;
@@ -1792,16 +1797,17 @@ static int virtnet_restore(struct virtio_device *vdev)
1792 if (err) 1797 if (err)
1793 return err; 1798 return err;
1794 1799
1795 if (netif_running(vi->dev)) 1800 if (netif_running(vi->dev)) {
1801 for (i = 0; i < vi->curr_queue_pairs; i++)
1802 if (!try_fill_recv(&vi->rq[i], GFP_KERNEL))
1803 schedule_delayed_work(&vi->refill, 0);
1804
1796 for (i = 0; i < vi->max_queue_pairs; i++) 1805 for (i = 0; i < vi->max_queue_pairs; i++)
1797 virtnet_napi_enable(&vi->rq[i]); 1806 virtnet_napi_enable(&vi->rq[i]);
1807 }
1798 1808
1799 netif_device_attach(vi->dev); 1809 netif_device_attach(vi->dev);
1800 1810
1801 for (i = 0; i < vi->curr_queue_pairs; i++)
1802 if (!try_fill_recv(&vi->rq[i], GFP_KERNEL))
1803 schedule_delayed_work(&vi->refill, 0);
1804
1805 mutex_lock(&vi->config_lock); 1811 mutex_lock(&vi->config_lock);
1806 vi->config_enable = true; 1812 vi->config_enable = true;
1807 mutex_unlock(&vi->config_lock); 1813 mutex_unlock(&vi->config_lock);