Re: [PATCH net-next v7 08/10] virtio_net: xsk: rx: support fill with xsk buffer
From: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Date: 2024-07-08 07:59:49
Also in:
bpf, virtualization
On Mon, 8 Jul 2024 14:49:35 +0800, Jason Wang [off-list ref] wrote:
On Fri, Jul 5, 2024 at 3:37 PM Xuan Zhuo [off-list ref] wrote:quoted
Implement the logic of filling rq with XSK buffers. Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> --- v7: 1. some small fixes drivers/net/virtio_net.c | 70 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 66 insertions(+), 4 deletions(-)diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 29fa25ce1a7f..2b27f5ada64a 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c@@ -354,6 +354,8 @@ struct receive_queue { /* xdp rxq used by xsk */ struct xdp_rxq_info xsk_rxq_info; + + struct xdp_buff **xsk_buffs; }; /* This structure can contain rss message with maximum settings for indirection table and keysize@@ -1054,6 +1056,53 @@ static void check_sq_full_and_disable(struct virtnet_info *vi, } } +static void sg_fill_dma(struct scatterlist *sg, dma_addr_t addr, u32 len) +{ + sg->dma_address = addr; + sg->length = len; +} + +static int virtnet_add_recvbuf_xsk(struct virtnet_info *vi, struct receive_queue *rq, + struct xsk_buff_pool *pool, gfp_t gfp) +{ + struct xdp_buff **xsk_buffs; + dma_addr_t addr; + int err = 0; + u32 len, i; + int num; + + xsk_buffs = rq->xsk_buffs; + + num = xsk_buff_alloc_batch(pool, xsk_buffs, rq->vq->num_free); + if (!num) + return -ENOMEM; + + len = xsk_pool_get_rx_frame_size(pool) + vi->hdr_len; + + for (i = 0; i < num; ++i) { + /* use the part of XDP_PACKET_HEADROOM as the virtnet hdr space */It's better to also say we assume hdr->len is larger than XDP_PACKET_HEADROOM. (see function xyz).quoted
+ addr = xsk_buff_xdp_get_dma(xsk_buffs[i]) - vi->hdr_len; + + sg_init_table(rq->sg, 1); + sg_fill_dma(rq->sg, addr, len); + + err = virtqueue_add_inbuf(rq->vq, rq->sg, 1, xsk_buffs[i], gfp); + if (err) + goto err; + } + + return num; + +err: + if (i) + err = i;Any reason to assign an index to err here?
I tried to return the num of bufs added to the ring. But rethink this, we should return the error of virtqueue_add_inbuf() directly. Will fix. Thanks.
Others look good. Thanks