diff options
Diffstat (limited to 'drivers/net/virtio_net.c')
-rw-r--r-- | drivers/net/virtio_net.c | 28 |
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 | ||
1368 | static void virtnet_free_queues(struct virtnet_info *vi) | 1368 | static 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); |