Thread (22 messages) 22 messages, 3 authors, 2024-07-08

Re: [PATCH net-next v7 08/10] virtio_net: xsk: rx: support fill with xsk buffer

From: Jason Wang <jasowang@redhat.com>
Date: 2024-07-08 06:49:51
Also in: bpf, virtualization

On Fri, Jul 5, 2024 at 3:37 PM Xuan Zhuo [off-list ref] wrote:
quoted hunk ↗ jump to hunk
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).
+               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?

Others look good.

Thanks
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help