On 3/2/26 3:57 PM, Michael S. Tsirkin wrote:
@@ -2666,32 +2603,25 @@ static void receive_buf(struct virtnet_info *vi, struct 
receive_queue *rq,
  static int add_recvbuf_small(struct virtnet_info *vi, struct receive_queue 
*rq,
                             gfp_t gfp)
  {
-       char *buf;
        unsigned int xdp_headroom = virtnet_get_headroom(vi);
        void *ctx = (void *)(unsigned long)xdp_headroom;
-       int len = vi->hdr_len + VIRTNET_RX_PAD + GOOD_PACKET_LEN + xdp_headroom;
+       unsigned int len = vi->hdr_len + VIRTNET_RX_PAD + GOOD_PACKET_LEN + 
xdp_headroom;
+       char *buf;
        int err;
len = SKB_DATA_ALIGN(len) +
              SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
- if (unlikely(!skb_page_frag_refill(len, &rq->alloc_frag, gfp)))
-               return -ENOMEM;
-
-       buf = virtnet_rq_alloc(rq, len, gfp);
+       buf = page_pool_alloc_va(rq->page_pool, &len, gfp);

So this can increase len (for end of page accounting).

        if (unlikely(!buf))
                return -ENOMEM;
buf += VIRTNET_RX_PAD + xdp_headroom; - virtnet_rq_init_one_sg(rq, buf, vi->hdr_len + GOOD_PACKET_LEN);
-
-       err = virtqueue_add_inbuf_premapped(rq->vq, rq->sg, 1, buf, ctx, gfp);
-       if (err < 0) {
-               virtnet_rq_unmap(rq, buf, 0);
-               put_page(virt_to_head_page(buf));
-       }
+       err = virtnet_rq_submit(rq, buf, vi->hdr_len + GOOD_PACKET_LEN, ctx, 
gfp);
+ if (err < 0)
+               page_pool_put_page(rq->page_pool, virt_to_head_page(buf), -1, 
false);
        return err;


But len is ignored in the rest of the function.
Will this not under-account truesize?


If it's intentional maybe add a comment explaining why?

It isn't intentional. I will add a separate alloc_len variable for the
page_pool_alloc_va() in v10.


  }


Reply via email to