From: Jason Wang <jasowang@redhat.com>
To: Xuan Zhuo <xuanzhuo@linux.alibaba.com>, netdev@vger.kernel.org
Cc: "Michael S. Tsirkin" <mst@redhat.com>,
"David S. Miller" <davem@davemloft.net>,
"Jakub Kicinski" <kuba@kernel.org>,
"Björn Töpel" <bjorn.topel@intel.com>,
"Magnus Karlsson" <magnus.karlsson@intel.com>,
"Jonathan Lemon" <jonathan.lemon@gmail.com>,
"Alexei Starovoitov" <ast@kernel.org>,
"Daniel Borkmann" <daniel@iogearbox.net>,
"Jesper Dangaard Brouer" <hawk@kernel.org>,
"John Fastabend" <john.fastabend@gmail.com>,
"Andrii Nakryiko" <andrii@kernel.org>,
"Martin KaFai Lau" <kafai@fb.com>,
"Song Liu" <songliubraving@fb.com>, "Yonghong Song" <yhs@fb.com>,
"KP Singh" <kpsingh@kernel.org>,
virtualization@lists.linux-foundation.org, bpf@vger.kernel.org
Subject: Re: [PATCH net-next v2 2/7] virtio-net, xsk: distinguish XDP_TX and XSK XMIT ctx
Date: Mon, 18 Jan 2021 14:45:16 +0800 [thread overview]
Message-ID: <7203b2a0-0f56-dee8-4ba0-cbbaf6456913@redhat.com> (raw)
In-Reply-To: <27006309ce40fe3f5375b44d4afaae39ed550855.1610765285.git.xuanzhuo@linux.alibaba.com>
On 2021/1/16 上午10:59, Xuan Zhuo wrote:
> If support xsk, a new ptr will be recovered during the
> process of freeing the old ptr. In order to distinguish between ctx sent
> by XDP_TX and ctx sent by xsk, a struct is added here to distinguish
> between these two situations. virtnet_xdp_type.type It is used to
> distinguish different ctx, and virtnet_xdp_type.offset is used to record
> the offset between "true ctx" and virtnet_xdp_type.
>
> The newly added virtnet_xsk_hdr will be used for xsk.
>
> Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Any reason that you can't simply encode the type in the pointer itself
as we used to do?
#define VIRTIO_XSK_FLAG BIT(1)
?
> ---
> drivers/net/virtio_net.c | 75 ++++++++++++++++++++++++++++++++++++++----------
> 1 file changed, 60 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index ba8e637..e707c31 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -94,6 +94,22 @@ struct virtnet_rq_stats {
> u64 kicks;
> };
>
> +enum {
> + XDP_TYPE_XSK,
> + XDP_TYPE_TX,
> +};
> +
> +struct virtnet_xdp_type {
> + int offset:24;
> + unsigned type:8;
> +};
> +
> +struct virtnet_xsk_hdr {
> + struct virtnet_xdp_type type;
> + struct virtio_net_hdr_mrg_rxbuf hdr;
> + u32 len;
> +};
> +
> #define VIRTNET_SQ_STAT(m) offsetof(struct virtnet_sq_stats, m)
> #define VIRTNET_RQ_STAT(m) offsetof(struct virtnet_rq_stats, m)
>
> @@ -251,14 +267,19 @@ static bool is_xdp_frame(void *ptr)
> return (unsigned long)ptr & VIRTIO_XDP_FLAG;
> }
>
> -static void *xdp_to_ptr(struct xdp_frame *ptr)
> +static void *xdp_to_ptr(struct virtnet_xdp_type *ptr)
> {
> return (void *)((unsigned long)ptr | VIRTIO_XDP_FLAG);
> }
>
> -static struct xdp_frame *ptr_to_xdp(void *ptr)
> +static struct virtnet_xdp_type *ptr_to_xtype(void *ptr)
> +{
> + return (struct virtnet_xdp_type *)((unsigned long)ptr & ~VIRTIO_XDP_FLAG);
> +}
> +
> +static void *xtype_get_ptr(struct virtnet_xdp_type *xdptype)
> {
> - return (struct xdp_frame *)((unsigned long)ptr & ~VIRTIO_XDP_FLAG);
> + return (char *)xdptype + xdptype->offset;
> }
>
> /* Converting between virtqueue no. and kernel tx/rx queue no.
> @@ -459,11 +480,16 @@ static int __virtnet_xdp_xmit_one(struct virtnet_info *vi,
> struct xdp_frame *xdpf)
> {
> struct virtio_net_hdr_mrg_rxbuf *hdr;
> + struct virtnet_xdp_type *xdptype;
> int err;
>
> - if (unlikely(xdpf->headroom < vi->hdr_len))
> + if (unlikely(xdpf->headroom < vi->hdr_len + sizeof(*xdptype)))
> return -EOVERFLOW;
>
> + xdptype = (struct virtnet_xdp_type *)(xdpf + 1);
> + xdptype->offset = (char *)xdpf - (char *)xdptype;
> + xdptype->type = XDP_TYPE_TX;
> +
> /* Make room for virtqueue hdr (also change xdpf->headroom?) */
> xdpf->data -= vi->hdr_len;
> /* Zero header and leave csum up to XDP layers */
> @@ -473,7 +499,7 @@ static int __virtnet_xdp_xmit_one(struct virtnet_info *vi,
>
> sg_init_one(sq->sg, xdpf->data, xdpf->len);
>
> - err = virtqueue_add_outbuf(sq->vq, sq->sg, 1, xdp_to_ptr(xdpf),
> + err = virtqueue_add_outbuf(sq->vq, sq->sg, 1, xdp_to_ptr(xdptype),
> GFP_ATOMIC);
> if (unlikely(err))
> return -ENOSPC; /* Caller handle free/refcnt */
> @@ -523,8 +549,11 @@ static int virtnet_xdp_xmit(struct net_device *dev,
> /* Free up any pending old buffers before queueing new ones. */
> while ((ptr = virtqueue_get_buf(sq->vq, &len)) != NULL) {
> if (likely(is_xdp_frame(ptr))) {
> - struct xdp_frame *frame = ptr_to_xdp(ptr);
> + struct virtnet_xdp_type *xtype;
> + struct xdp_frame *frame;
>
> + xtype = ptr_to_xtype(ptr);
> + frame = xtype_get_ptr(xtype);
> bytes += frame->len;
> xdp_return_frame(frame);
> } else {
> @@ -1373,24 +1402,34 @@ static int virtnet_receive(struct receive_queue *rq, int budget,
>
> static void free_old_xmit_skbs(struct send_queue *sq, bool in_napi)
> {
> - unsigned int len;
> unsigned int packets = 0;
> unsigned int bytes = 0;
> - void *ptr;
> + unsigned int len;
> + struct virtnet_xdp_type *xtype;
> + struct xdp_frame *frame;
> + struct virtnet_xsk_hdr *xskhdr;
> + struct sk_buff *skb;
> + void *ptr;
>
> while ((ptr = virtqueue_get_buf(sq->vq, &len)) != NULL) {
> if (likely(!is_xdp_frame(ptr))) {
> - struct sk_buff *skb = ptr;
> + skb = ptr;
>
> pr_debug("Sent skb %p\n", skb);
>
> bytes += skb->len;
> napi_consume_skb(skb, in_napi);
> } else {
> - struct xdp_frame *frame = ptr_to_xdp(ptr);
> + xtype = ptr_to_xtype(ptr);
>
> - bytes += frame->len;
> - xdp_return_frame(frame);
> + if (xtype->type == XDP_TYPE_XSK) {
> + xskhdr = (struct virtnet_xsk_hdr *)xtype;
> + bytes += xskhdr->len;
> + } else {
> + frame = xtype_get_ptr(xtype);
> + xdp_return_frame(frame);
> + bytes += frame->len;
> + }
> }
> packets++;
> }
> @@ -2659,10 +2698,16 @@ static void free_unused_bufs(struct virtnet_info *vi)
> for (i = 0; i < vi->max_queue_pairs; i++) {
> struct virtqueue *vq = vi->sq[i].vq;
> while ((buf = virtqueue_detach_unused_buf(vq)) != NULL) {
> - if (!is_xdp_frame(buf))
> + if (!is_xdp_frame(buf)) {
> dev_kfree_skb(buf);
> - else
> - xdp_return_frame(ptr_to_xdp(buf));
> + } else {
> + struct virtnet_xdp_type *xtype;
> +
> + xtype = ptr_to_xtype(buf);
> +
> + if (xtype->type != XDP_TYPE_XSK)
> + xdp_return_frame(xtype_get_ptr(xtype));
> + }
> }
> }
>
next prev parent reply other threads:[~2021-01-18 6:47 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-05 9:11 [PATCH netdev 0/5] virtio-net support xdp socket zero copy xmit Xuan Zhuo
2021-01-05 9:11 ` [PATCH netdev 1/5] xsk: support get page for drv Xuan Zhuo
2021-01-05 9:11 ` [PATCH netdev 2/5] virtio-net: support XDP_TX when not more queues Xuan Zhuo
2021-01-05 9:11 ` [PATCH netdev 3/5] virtio-net, xsk: distinguish XDP_TX and XSK XMIT ctx Xuan Zhuo
2021-01-05 9:11 ` [PATCH netdev 4/5] xsk, virtio-net: prepare for support xsk Xuan Zhuo
2021-01-05 9:11 ` [PATCH netdev 5/5] virtio-net, xsk: virtio-net support xsk zero copy tx Xuan Zhuo
2021-01-05 13:21 ` Michael S. Tsirkin
2021-01-05 9:32 ` [PATCH netdev 0/5] virtio-net support xdp socket zero copy xmit Jason Wang
2021-01-05 12:25 ` Michael S. Tsirkin
2021-01-16 2:59 ` [PATCH net-next v2 0/7] " Xuan Zhuo
2021-01-16 2:59 ` [PATCH net-next v2 1/7] xsk: support get page for drv Xuan Zhuo
2021-01-16 2:59 ` [PATCH net-next v2 2/7] virtio-net, xsk: distinguish XDP_TX and XSK XMIT ctx Xuan Zhuo
2021-01-18 6:45 ` Jason Wang [this message]
2021-01-16 2:59 ` [PATCH net-next v2 3/7] xsk, virtio-net: prepare for support xsk zerocopy xmit Xuan Zhuo
2021-01-16 2:59 ` [PATCH net-next v2 4/7] virtio-net, xsk: support xsk enable/disable Xuan Zhuo
2021-01-16 2:59 ` [PATCH net-next v2 5/7] virtio-net, xsk: realize the function of xsk packet sending Xuan Zhuo
2021-01-16 4:47 ` Jakub Kicinski
2021-01-18 9:10 ` Jason Wang
2021-01-18 12:27 ` Michael S. Tsirkin
2021-01-16 2:59 ` [PATCH net-next v2 6/7] virtio-net, xsk: implement xsk wakeup callback Xuan Zhuo
2021-01-19 4:50 ` Jason Wang
2021-01-16 2:59 ` [PATCH net-next v2 7/7] virtio-net, xsk: set xsk completed when packet sent done Xuan Zhuo
2021-01-18 6:28 ` [PATCH net-next v2 0/7] virtio-net support xdp socket zero copy xmit Jason Wang
[not found] <1610970895.0597434-1-xuanzhuo@linux.alibaba.com>
2021-01-20 3:23 ` [PATCH net-next v2 2/7] virtio-net, xsk: distinguish XDP_TX and XSK XMIT ctx Jason Wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7203b2a0-0f56-dee8-4ba0-cbbaf6456913@redhat.com \
--to=jasowang@redhat.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bjorn.topel@intel.com \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=hawk@kernel.org \
--cc=john.fastabend@gmail.com \
--cc=jonathan.lemon@gmail.com \
--cc=kafai@fb.com \
--cc=kpsingh@kernel.org \
--cc=kuba@kernel.org \
--cc=magnus.karlsson@intel.com \
--cc=mst@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=songliubraving@fb.com \
--cc=virtualization@lists.linux-foundation.org \
--cc=xuanzhuo@linux.alibaba.com \
--cc=yhs@fb.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).