Re: [PATCH net-next v6 07/10] virtio_net: xsk: rx: support fill with xsk buffer
From: Jason Wang <jasowang@redhat.com>
Date: 2024-07-01 03:05:54
Also in:
bpf, netdev
On Fri, Jun 28, 2024 at 1:44 PM Xuan Zhuo [off-list ref] wrote:
On Fri, 28 Jun 2024 10:19:37 +0800, Jason Wang [off-list ref] wrote:quoted
On Tue, Jun 18, 2024 at 3:57 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> --- drivers/net/virtio_net.c | 68 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 2 deletions(-)diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 2bbc715f22c6..2ac5668a94ce 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c@@ -355,6 +355,8 @@ struct receive_queue { /* xdp rxq used by xsk */ struct xdp_rxq_info xdp_rxq; + + struct xdp_buff **xsk_buffs; } xsk; };@@ -1032,6 +1034,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; + u32 len, i; + int err = 0; + int num; + + xsk_buffs = rq->xsk.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 */ + addr = xsk_buff_xdp_get_dma(xsk_buffs[i]) - vi->hdr_len;We had VIRTIO_XDP_HEADROOM, can we reuse it? Or if it's redundant let's send a patch to switch to XDP_PACKET_HEADROOM.Do you mean replace it inside the comment?
I meant a patch to s/VIRTIO_XDP_HEADROOM/XDP_PACKET_HEADROOM/g.
I want to describe use the headroom of xsk, the size of the headroom is XDP_PACKET_HEADROOM.quoted
Btw, the code assumes vi->hdr_len < xsk_pool_get_headroom(). It's better to fail if it's not true when enabling xsk.It is ok.
I mean do we need a check to fail xsk binding if vi->hdr_len > xsk_pool_get_headroom() or it has been guaranteed by the code already. Thanks
Thanks.quoted
Thanks