Re: [PATCH net-next 5/8] virtio_net: separate the logic of freeing the rest mergeable buf

2023-04-02 Thread Jason Wang
On Tue, Mar 28, 2023 at 8:04 PM Xuan Zhuo  wrote:
>
> This patch introduce a new function that frees the rest mergeable buf.
> The subsequent patch will reuse this function.
>
> Signed-off-by: Xuan Zhuo 

Acked-by: Jason Wang 

Thanks

> ---
>  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

[PATCH net-next 5/8] virtio_net: separate the logic of freeing the rest mergeable buf

2023-03-28 Thread Xuan Zhuo
This patch introduce a new function that frees the rest mergeable buf.
The subsequent patch will reuse this function.

Signed-off-by: Xuan Zhuo 
---
 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


[PATCH net-next 5/8] virtio_net: separate the logic of freeing the rest mergeable buf

2023-03-21 Thread Xuan Zhuo
This patch introduce a new function that frees the rest mergeable buf.
The subsequent patch will reuse this function.

Signed-off-by: Xuan Zhuo 
---
 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