This patch separates two functions for freeing sq buf and rq buf from
free_unused_bufs().

When supporting the enable/disable tx/rq queue in the future, it is
necessary to support separate recovery of a sq buf or a rq buf.

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

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index a801ea40908f..9a1445236e23 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -2804,36 +2804,45 @@ static void free_receive_page_frags(struct virtnet_info 
*vi)
                        put_page(vi->rq[i].alloc_frag.page);
 }
 
-static void free_unused_bufs(struct virtnet_info *vi)
+static void virtnet_sq_free_unused_bufs(struct virtnet_info *vi,
+                                       struct send_queue *sq)
 {
        void *buf;
-       int i;
 
-       for (i = 0; i < vi->max_queue_pairs; i++) {
-               struct virtqueue *vq = vi->sq[i].vq;
-               while ((buf = virtqueue_detach_unused_buf(vq)) != NULL) {
-                       if (!is_xdp_frame(buf))
-                               dev_kfree_skb(buf);
-                       else
-                               xdp_return_frame(ptr_to_xdp(buf));
-               }
+       while ((buf = virtqueue_detach_unused_buf(sq->vq)) != NULL) {
+               if (!is_xdp_frame(buf))
+                       dev_kfree_skb(buf);
+               else
+                       xdp_return_frame(ptr_to_xdp(buf));
        }
+}
 
-       for (i = 0; i < vi->max_queue_pairs; i++) {
-               struct virtqueue *vq = vi->rq[i].vq;
-
-               while ((buf = virtqueue_detach_unused_buf(vq)) != NULL) {
-                       if (vi->mergeable_rx_bufs) {
-                               put_page(virt_to_head_page(buf));
-                       } else if (vi->big_packets) {
-                               give_pages(&vi->rq[i], buf);
-                       } else {
-                               put_page(virt_to_head_page(buf));
-                       }
-               }
+static void virtnet_rq_free_unused_bufs(struct virtnet_info *vi,
+                                       struct receive_queue *rq)
+{
+       void *buf;
+
+       while ((buf = virtqueue_detach_unused_buf(rq->vq)) != NULL) {
+               if (vi->mergeable_rx_bufs)
+                       put_page(virt_to_head_page(buf));
+               else if (vi->big_packets)
+                       give_pages(rq, buf);
+               else
+                       put_page(virt_to_head_page(buf));
        }
 }
 
+static void free_unused_bufs(struct virtnet_info *vi)
+{
+       int i;
+
+       for (i = 0; i < vi->max_queue_pairs; i++)
+               virtnet_sq_free_unused_bufs(vi, vi->sq + i);
+
+       for (i = 0; i < vi->max_queue_pairs; i++)
+               virtnet_rq_free_unused_bufs(vi, vi->rq + i);
+}
+
 static void virtnet_del_vqs(struct virtnet_info *vi)
 {
        struct virtio_device *vdev = vi->vdev;
-- 
2.31.0

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

Reply via email to