Re: [PATCH net-next v9] virtio_net: add page_pool support for buffer allocation
From: Vishwanath Seshagiri <hidden>
Date: 2026-03-02 10:46:27
Also in:
lkml, virtualization
On 3/2/26 3:57 PM, Michael S. Tsirkin wrote:
quoted
@@ -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).quoted
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.
quoted
}