All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Cc: netdev@vger.kernel.org, "David S. Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Jason Wang <jasowang@redhat.com>,
	Alexei Starovoitov <ast@kernel.org>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Jesper Dangaard Brouer <hawk@kernel.org>,
	John Fastabend <john.fastabend@gmail.com>,
	virtualization@lists.linux-foundation.org, bpf@vger.kernel.org
Subject: Re: [PATCH net-next v2 12/21] virtio_net: xsk: tx: support tx
Date: Thu, 9 Nov 2023 06:58:48 -0500	[thread overview]
Message-ID: <20231109061507-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <1699527983.483377-3-xuanzhuo@linux.alibaba.com>

On Thu, Nov 09, 2023 at 07:06:23PM +0800, Xuan Zhuo wrote:
> On Thu, 9 Nov 2023 03:09:00 -0500, "Michael S. Tsirkin" <mst@redhat.com> wrote:
> > On Tue, Nov 07, 2023 at 11:12:18AM +0800, Xuan Zhuo wrote:
> > > The driver's tx napi is very important for XSK. It is responsible for
> > > obtaining data from the XSK queue and sending it out.
> > >
> > > At the beginning, we need to trigger tx napi.
> > >
> > > Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
> > > ---
> > >  drivers/net/virtio/main.c       |  12 +++-
> > >  drivers/net/virtio/virtio_net.h |   3 +-
> > >  drivers/net/virtio/xsk.c        | 110 ++++++++++++++++++++++++++++++++
> > >  drivers/net/virtio/xsk.h        |  13 ++++
> > >  4 files changed, 136 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/drivers/net/virtio/main.c b/drivers/net/virtio/main.c
> > > index 6c608b3ce27d..ff6bc764089d 100644
> > > --- a/drivers/net/virtio/main.c
> > > +++ b/drivers/net/virtio/main.c
> > > @@ -2074,6 +2074,7 @@ static int virtnet_poll_tx(struct napi_struct *napi, int budget)
> > >  	struct virtnet_info *vi = sq->vq->vdev->priv;
> > >  	unsigned int index = vq2txq(sq->vq);
> > >  	struct netdev_queue *txq;
> > > +	int busy = 0;
> > >  	int opaque;
> > >  	bool done;
> > >
> > > @@ -2086,11 +2087,20 @@ static int virtnet_poll_tx(struct napi_struct *napi, int budget)
> > >  	txq = netdev_get_tx_queue(vi->dev, index);
> > >  	__netif_tx_lock(txq, raw_smp_processor_id());
> > >  	virtqueue_disable_cb(sq->vq);
> > > -	free_old_xmit(sq, true);
> > > +
> > > +	if (sq->xsk.pool)
> > > +		busy |= virtnet_xsk_xmit(sq, sq->xsk.pool, budget);
> >
> > You use bitwise or on errno values? What's going on here?
> 
> virtnet_xsk_xmit() return that it is busy or not. Not the errno.
> Here just record whether this handler is busy or not.


Ah I see it's a bool. So make busy a bool too.


> >
> >
> > > +	else
> > > +		free_old_xmit(sq, true);
> > >
> > >  	if (sq->vq->num_free >= 2 + MAX_SKB_FRAGS)
> > >  		netif_tx_wake_queue(txq);
> > >
> > > +	if (busy) {
> > > +		__netif_tx_unlock(txq);
> > > +		return budget;
> > > +	}
> > > +
> > >  	opaque = virtqueue_enable_cb_prepare(sq->vq);
> > >
> > >  	done = napi_complete_done(napi, 0);
> > > diff --git a/drivers/net/virtio/virtio_net.h b/drivers/net/virtio/virtio_net.h
> > > index 442af4673bf8..1c21af47e13c 100644
> > > --- a/drivers/net/virtio/virtio_net.h
> > > +++ b/drivers/net/virtio/virtio_net.h
> > > @@ -9,7 +9,8 @@
> > >  #include <net/xdp_sock_drv.h>
> > >
> > >  #define VIRTIO_XDP_FLAG	BIT(0)
> > > -#define VIRTIO_XMIT_DATA_MASK (VIRTIO_XDP_FLAG)
> > > +#define VIRTIO_XSK_FLAG	BIT(1)
> > > +#define VIRTIO_XMIT_DATA_MASK (VIRTIO_XDP_FLAG | VIRTIO_XSK_FLAG)
> > >
> > >  /* RX packet size EWMA. The average packet size is used to determine the packet
> > >   * buffer size when refilling RX rings. As the entire RX ring may be refilled
> > > diff --git a/drivers/net/virtio/xsk.c b/drivers/net/virtio/xsk.c
> > > index 8b397787603f..caa448308232 100644
> > > --- a/drivers/net/virtio/xsk.c
> > > +++ b/drivers/net/virtio/xsk.c
> > > @@ -4,9 +4,119 @@
> > >   */
> > >
> > >  #include "virtio_net.h"
> > > +#include "xsk.h"
> > >
> > >  static struct virtio_net_hdr_mrg_rxbuf xsk_hdr;
> > >
> > > +static void sg_fill_dma(struct scatterlist *sg, dma_addr_t addr, u32 len)
> > > +{
> > > +	sg->dma_address = addr;
> > > +	sg->length = len;
> > > +}
> > > +
> > > +static void virtnet_xsk_check_queue(struct virtnet_sq *sq)
> > > +{
> > > +	struct virtnet_info *vi = sq->vq->vdev->priv;
> > > +	struct net_device *dev = vi->dev;
> > > +	int qnum = sq - vi->sq;
> > > +
> > > +	/* If it is a raw buffer queue, it does not check whether the status
> > > +	 * of the queue is stopped when sending. So there is no need to check
> > > +	 * the situation of the raw buffer queue.
> > > +	 */
> > > +	if (virtnet_is_xdp_raw_buffer_queue(vi, qnum))
> > > +		return;
> > > +
> > > +	/* If this sq is not the exclusive queue of the current cpu,
> > > +	 * then it may be called by start_xmit, so check it running out
> > > +	 * of space.
> > > +	 *
> > > +	 * Stop the queue to avoid getting packets that we are
> > > +	 * then unable to transmit. Then wait the tx interrupt.
> > > +	 */
> > > +	if (sq->vq->num_free < 2 + MAX_SKB_FRAGS)
> >
> > what does MAX_SKB_FRAGS have to do with it? And where's 2 coming from?
> 
> check_sq_full_and_disable()
> 
> Thanks.


This is one example of duplication I was talking about earlier.

> >
> > > +		netif_stop_subqueue(dev, qnum);
> > > +}
> > > +
> > > +static int virtnet_xsk_xmit_one(struct virtnet_sq *sq,
> > > +				struct xsk_buff_pool *pool,
> > > +				struct xdp_desc *desc)
> > > +{
> > > +	struct virtnet_info *vi;
> > > +	dma_addr_t addr;
> > > +
> > > +	vi = sq->vq->vdev->priv;
> > > +
> > > +	addr = xsk_buff_raw_get_dma(pool, desc->addr);
> > > +	xsk_buff_raw_dma_sync_for_device(pool, addr, desc->len);
> > > +
> > > +	sg_init_table(sq->sg, 2);
> > > +
> > > +	sg_fill_dma(sq->sg, sq->xsk.hdr_dma_address, vi->hdr_len);
> > > +	sg_fill_dma(sq->sg + 1, addr, desc->len);
> > > +
> > > +	return virtqueue_add_outbuf(sq->vq, sq->sg, 2,
> > > +				    virtnet_xsk_to_ptr(desc->len), GFP_ATOMIC);
> > > +}
> > > +
> > > +static int virtnet_xsk_xmit_batch(struct virtnet_sq *sq,
> > > +				  struct xsk_buff_pool *pool,
> > > +				  unsigned int budget,
> > > +				  u64 *kicks)
> > > +{
> > > +	struct xdp_desc *descs = pool->tx_descs;
> > > +	u32 nb_pkts, max_pkts, i;
> > > +	bool kick = false;
> > > +	int err;
> > > +
> > > +	/* Every xsk tx packet needs two desc(virtnet header and packet). So we
> > > +	 * use sq->vq->num_free / 2 as the limitation.
> > > +	 */
> > > +	max_pkts = min_t(u32, budget, sq->vq->num_free / 2);
> > > +
> > > +	nb_pkts = xsk_tx_peek_release_desc_batch(pool, max_pkts);
> > > +	if (!nb_pkts)
> > > +		return 0;
> > > +
> > > +	for (i = 0; i < nb_pkts; i++) {
> > > +		err = virtnet_xsk_xmit_one(sq, pool, &descs[i]);
> > > +		if (unlikely(err))
> > > +			break;
> > > +
> > > +		kick = true;
> > > +	}
> > > +
> > > +	if (kick && virtqueue_kick_prepare(sq->vq) && virtqueue_notify(sq->vq))
> > > +		(*kicks)++;
> > > +
> > > +	return i;
> > > +}
> > > +
> > > +bool virtnet_xsk_xmit(struct virtnet_sq *sq, struct xsk_buff_pool *pool,
> > > +		      int budget)
> > > +{
> > > +	u64 bytes = 0, packets = 0, kicks = 0;
> > > +	int sent;
> > > +
> > > +	virtnet_free_old_xmit(sq, true, &bytes, &packets);
> > > +
> > > +	sent = virtnet_xsk_xmit_batch(sq, pool, budget, &kicks);
> > > +
> > > +	virtnet_xsk_check_queue(sq);
> > > +
> > > +	u64_stats_update_begin(&sq->stats.syncp);
> > > +	u64_stats_add(&sq->stats.packets, packets);
> > > +	u64_stats_add(&sq->stats.bytes, bytes);
> > > +	u64_stats_add(&sq->stats.kicks, kicks);
> > > +	u64_stats_add(&sq->stats.xdp_tx,  sent);
> > > +	u64_stats_update_end(&sq->stats.syncp);
> > > +
> > > +	if (xsk_uses_need_wakeup(pool))
> > > +		xsk_set_tx_need_wakeup(pool);
> > > +
> > > +	return sent == budget;
> > > +}
> > > +
> > >  static int virtnet_rq_bind_xsk_pool(struct virtnet_info *vi, struct virtnet_rq *rq,
> > >  				    struct xsk_buff_pool *pool)
> > >  {
> > > diff --git a/drivers/net/virtio/xsk.h b/drivers/net/virtio/xsk.h
> > > index 1918285c310c..73ca8cd5308b 100644
> > > --- a/drivers/net/virtio/xsk.h
> > > +++ b/drivers/net/virtio/xsk.h
> > > @@ -3,5 +3,18 @@
> > >  #ifndef __XSK_H__
> > >  #define __XSK_H__
> > >
> > > +#define VIRTIO_XSK_FLAG_OFFSET	4
> > > +
> > > +static inline void *virtnet_xsk_to_ptr(u32 len)
> > > +{
> > > +	unsigned long p;
> > > +
> > > +	p = len << VIRTIO_XSK_FLAG_OFFSET;
> > > +
> > > +	return (void *)(p | VIRTIO_XSK_FLAG);
> > > +}
> > > +
> > >  int virtnet_xsk_pool_setup(struct net_device *dev, struct netdev_bpf *xdp);
> > > +bool virtnet_xsk_xmit(struct virtnet_sq *sq, struct xsk_buff_pool *pool,
> > > +		      int budget);
> > >  #endif
> > > --
> > > 2.32.0.3.g01195cf9f
> >


  reply	other threads:[~2023-11-09 11:58 UTC|newest]

Thread overview: 83+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-07  3:12 [PATCH net-next v2 00/21] virtio-net: support AF_XDP zero copy Xuan Zhuo
2023-11-07  3:12 ` Xuan Zhuo
2023-11-07  3:12 ` [PATCH net-next v2 01/21] virtio_net: rename free_old_xmit_skbs to free_old_xmit Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-07  3:12 ` [PATCH net-next v2 02/21] virtio_net: unify the code for recycling the xmit ptr Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-07  3:12 ` [PATCH net-next v2 03/21] virtio_net: independent directory Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-07  3:12 ` [PATCH net-next v2 04/21] virtio_net: move core structures to virtio_net.h Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-09  6:03   ` Jason Wang
2023-11-07  3:12 ` [PATCH net-next v2 05/21] virtio_net: add prefix virtnet to all struct inside virtio_net.h Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-09  6:04   ` Jason Wang
2023-11-07  3:12 ` [PATCH net-next v2 06/21] virtio_net: separate virtnet_rx_resize() Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-07  3:12 ` [PATCH net-next v2 07/21] virtio_net: separate virtnet_tx_resize() Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-07  3:12 ` [PATCH net-next v2 08/21] virtio_net: sq support premapped mode Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-09  6:37   ` Jason Wang
2023-11-09 10:58     ` Xuan Zhuo
2023-11-14  3:26       ` Jason Wang
2023-11-14  3:28         ` Xuan Zhuo
2023-11-14  3:55           ` Jason Wang
2023-11-14  3:57             ` Xuan Zhuo
2023-11-14  4:27               ` Jason Wang
2023-11-14  4:45                 ` Xuan Zhuo
2023-11-07  3:12 ` [PATCH net-next v2 09/21] virtio_net: xsk: bind/unbind xsk Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-07  3:12 ` [PATCH net-next v2 10/21] virtio_net: xsk: prevent disable tx napi Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-07  3:12 ` [PATCH net-next v2 11/21] virtio_net: move some api to header Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-07  3:12 ` [PATCH net-next v2 12/21] virtio_net: xsk: tx: support tx Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-09  8:09   ` Michael S. Tsirkin
2023-11-09 11:06     ` Xuan Zhuo
2023-11-09 11:58       ` Michael S. Tsirkin [this message]
2023-11-10  1:51         ` Xuan Zhuo
2023-11-07  3:12 ` [PATCH net-next v2 13/21] virtio_net: xsk: tx: support wakeup Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-07  3:12 ` [PATCH net-next v2 14/21] virtio_net: xsk: tx: virtnet_free_old_xmit() distinguishes xsk buffer Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-09 11:11   ` Michael S. Tsirkin
2023-11-09 11:16     ` Xuan Zhuo
2023-11-09 11:59       ` Michael S. Tsirkin
2023-11-10  1:44         ` Xuan Zhuo
2023-11-10  5:32           ` Michael S. Tsirkin
2023-11-10  5:50             ` Xuan Zhuo
2023-11-07  3:12 ` [PATCH net-next v2 15/21] virtio_net: xsk: tx: virtnet_sq_free_unused_buf() check " Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-07  3:12 ` [PATCH net-next v2 16/21] virtio_net: xsk: rx: introduce add_recvbuf_xsk() Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-09  8:12   ` Michael S. Tsirkin
2023-11-09 11:11     ` Xuan Zhuo
2023-11-09 16:26       ` Maciej Fijalkowski
2023-11-10  2:38         ` Xuan Zhuo
2023-11-13 16:00           ` Maciej Fijalkowski
2023-11-14  3:16             ` Xuan Zhuo
2023-11-10  3:04     ` Xuan Zhuo
2023-11-07  3:12 ` [PATCH net-next v2 17/21] virtio_net: xsk: rx: skip dma unmap when rq is bind with AF_XDP Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-09  8:15   ` Michael S. Tsirkin
2023-11-09 11:10     ` Xuan Zhuo
2023-11-09 12:00       ` Michael S. Tsirkin
2023-11-10  1:47         ` Xuan Zhuo
2023-11-10  5:33           ` Michael S. Tsirkin
2023-11-10  5:51             ` Xuan Zhuo
2023-11-07  3:12 ` [PATCH net-next v2 18/21] virtio_net: xsk: rx: introduce receive_xsk() to recv xsk buffer Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-13 16:11   ` Maciej Fijalkowski
2023-11-14  3:43     ` Xuan Zhuo
2023-11-07  3:12 ` [PATCH net-next v2 19/21] virtio_net: xsk: rx: virtnet_rq_free_unused_buf() check " Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-07  3:12 ` [PATCH net-next v2 20/21] virtio_net: update tx timeout record Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-07  3:12 ` [PATCH net-next v2 21/21] virtio_net: xdp_features add NETDEV_XDP_ACT_XSK_ZEROCOPY Xuan Zhuo
2023-11-07  3:12   ` Xuan Zhuo
2023-11-07 18:01 ` [PATCH net-next v2 00/21] virtio-net: support AF_XDP zero copy Jakub Kicinski
2023-11-08  5:49   ` Xuan Zhuo
2023-11-09  8:19 ` Michael S. Tsirkin
2023-11-09 10:37   ` Xuan Zhuo

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=20231109061507-mutt-send-email-mst@kernel.org \
    --to=mst@redhat.com \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=hawk@kernel.org \
    --cc=jasowang@redhat.com \
    --cc=john.fastabend@gmail.com \
    --cc=kuba@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=virtualization@lists.linux-foundation.org \
    --cc=xuanzhuo@linux.alibaba.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.