This patch introduce a new function that frees the rest mergeable buf.
The subsequent patch will reuse this function.

Signed-off-by: Xuan Zhuo <xuanz...@linux.alibaba.com>
---
 drivers/net/virtio_net.c | 36 ++++++++++++++++++++++++------------
 1 file changed, 24 insertions(+), 12 deletions(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 09aed60e2f51..a3f2bcb3db27 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -1076,6 +1076,28 @@ static struct sk_buff *receive_big(struct net_device 
*dev,
        return NULL;
 }
 
+static void mergeable_buf_free(struct receive_queue *rq, int num_buf,
+                              struct net_device *dev,
+                              struct virtnet_rq_stats *stats)
+{
+       struct page *page;
+       void *buf;
+       int len;
+
+       while (num_buf-- > 1) {
+               buf = virtqueue_get_buf(rq->vq, &len);
+               if (unlikely(!buf)) {
+                       pr_debug("%s: rx error: %d buffers missing\n",
+                                dev->name, num_buf);
+                       dev->stats.rx_length_errors++;
+                       break;
+               }
+               stats->bytes += len;
+               page = virt_to_head_page(buf);
+               put_page(page);
+       }
+}
+
 /* Why not use xdp_build_skb_from_frame() ?
  * XDP core assumes that xdp frags are PAGE_SIZE in length, while in
  * virtio-net there are 2 points that do not match its requirements:
@@ -1436,18 +1458,8 @@ static struct sk_buff *receive_mergeable(struct 
net_device *dev,
        stats->xdp_drops++;
 err_skb:
        put_page(page);
-       while (num_buf-- > 1) {
-               buf = virtqueue_get_buf(rq->vq, &len);
-               if (unlikely(!buf)) {
-                       pr_debug("%s: rx error: %d buffers missing\n",
-                                dev->name, num_buf);
-                       dev->stats.rx_length_errors++;
-                       break;
-               }
-               stats->bytes += len;
-               page = virt_to_head_page(buf);
-               put_page(page);
-       }
+       mergeable_buf_free(rq, num_buf, dev, stats);
+
 err_buf:
        stats->drops++;
        dev_kfree_skb(head_skb);
-- 
2.32.0.3.g01195cf9f

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to