All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stephen Hemminger <stephen@networkplumber.org>
To: Huawei Xie <huawei.xie@intel.com>
Cc: dev@dpdk.org
Subject: Re: [PATCH v4 6/7] virtio: simple tx routine
Date: Thu, 22 Oct 2015 09:57:30 -0700	[thread overview]
Message-ID: <20151022095730.5a3c742b@xeon-e3> (raw)
In-Reply-To: <1445515791-25909-7-git-send-email-huawei.xie@intel.com>

On Thu, 22 Oct 2015 20:09:50 +0800
Huawei Xie <huawei.xie@intel.com> wrote:

> Changes in v4:
> - move virtio_xmit_cleanup ahead to free descriptors earlier
> 
> Changes in v3:
> - Remove return at the end of void function
> - Remove always_inline attribute for virtio_xmit_cleanup
> bulk free of mbufs when clean used ring.
> shift operation of idx could be saved if vq_free_cnt means
> free slots rather than free descriptors.
> 
> TODO: rearrange vq data structure, pack the stats var together so that we
> could use one vec instruction to update all of them.
> 
> Signed-off-by: Huawei Xie <huawei.xie@intel.com>
> ---
>  drivers/net/virtio/virtio_ethdev.h      |  3 ++
>  drivers/net/virtio/virtio_rxtx_simple.c | 93 +++++++++++++++++++++++++++++++++
>  2 files changed, 96 insertions(+)
> 
> diff --git a/drivers/net/virtio/virtio_ethdev.h b/drivers/net/virtio/virtio_ethdev.h
> index d7797ab..ae2d47d 100644
> --- a/drivers/net/virtio/virtio_ethdev.h
> +++ b/drivers/net/virtio/virtio_ethdev.h
> @@ -111,6 +111,9 @@ uint16_t virtio_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
>  uint16_t virtio_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
>  		uint16_t nb_pkts);
>  
> +uint16_t virtio_xmit_pkts_simple(void *tx_queue, struct rte_mbuf **tx_pkts,
> +		uint16_t nb_pkts);
> +
>  /*
>   * The VIRTIO_NET_F_GUEST_TSO[46] features permit the host to send us
>   * frames larger than 1514 bytes. We do not yet support software LRO
> diff --git a/drivers/net/virtio/virtio_rxtx_simple.c b/drivers/net/virtio/virtio_rxtx_simple.c
> index ef17562..79b4f7f 100644
> --- a/drivers/net/virtio/virtio_rxtx_simple.c
> +++ b/drivers/net/virtio/virtio_rxtx_simple.c
> @@ -288,6 +288,99 @@ virtio_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts,
>  	return nb_pkts_received;
>  }
>  
> +#define VIRTIO_TX_FREE_THRESH 32
> +#define VIRTIO_TX_MAX_FREE_BUF_SZ 32
> +#define VIRTIO_TX_FREE_NR 32
> +/* TODO: vq->tx_free_cnt could mean num of free slots so we could avoid shift */
> +static inline void
> +virtio_xmit_cleanup(struct virtqueue *vq)
> +{
> +	uint16_t i, desc_idx;
> +	int nb_free = 0;
> +	struct rte_mbuf *m, *free[VIRTIO_TX_MAX_FREE_BUF_SZ];
> +
> +	desc_idx = (uint16_t)(vq->vq_used_cons_idx &
> +		((vq->vq_nentries >> 1) - 1));
> +	free[0] = (struct rte_mbuf *)vq->vq_descx[desc_idx++].cookie;
> +	nb_free = 1;
> +
> +	for (i = 1; i < VIRTIO_TX_FREE_NR; i++) {
> +		m = (struct rte_mbuf *)vq->vq_descx[desc_idx++].cookie;
> +		if (likely(m->pool == free[0]->pool))
> +			free[nb_free++] = m;
> +		else {
> +			rte_mempool_put_bulk(free[0]->pool, (void **)free,
> +				nb_free);
> +			free[0] = m;
> +			nb_free = 1;
> +		}
> +	}
> +
> +	rte_mempool_put_bulk(free[0]->pool, (void **)free, nb_free);
> +	vq->vq_used_cons_idx += VIRTIO_TX_FREE_NR;
> +	vq->vq_free_cnt += (VIRTIO_TX_FREE_NR << 1);
> +}

I think you need to handle refcount, here is a similar patch
for ixgbe.

Subject: ixgbe: speed up transmit

Coalesce transmit buffers and put them back into the pool
in one burst.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>

--- a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c
+++ b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c
@@ -120,12 +120,16 @@ rte_rxmbuf_alloc(struct rte_mempool *mp)
  * Check for descriptors with their DD bit set and free mbufs.
  * Return the total number of buffers freed.
  */
+#define TX_FREE_BULK 32
+
 static inline int __attribute__((always_inline))
 ixgbe_tx_free_bufs(struct ixgbe_tx_queue *txq)
 {
 	struct ixgbe_tx_entry *txep;
 	uint32_t status;
-	int i;
+	int i, n = 0;
+	struct rte_mempool *txpool = NULL;
+	struct rte_mbuf *free_list[TX_FREE_BULK];
 
 	/* check DD bit on threshold descriptor */
 	status = txq->tx_ring[txq->tx_next_dd].wb.status;
@@ -138,20 +142,26 @@ ixgbe_tx_free_bufs(struct ixgbe_tx_queue
 	 */
 	txep = &(txq->sw_ring[txq->tx_next_dd - (txq->tx_rs_thresh - 1)]);
 
-	/* free buffers one at a time */
-	if ((txq->txq_flags & (uint32_t)ETH_TXQ_FLAGS_NOREFCOUNT) != 0) {
-		for (i = 0; i < txq->tx_rs_thresh; ++i, ++txep) {
-			txep->mbuf->next = NULL;
-			rte_mempool_put(txep->mbuf->pool, txep->mbuf);
-			txep->mbuf = NULL;
-		}
-	} else {
-		for (i = 0; i < txq->tx_rs_thresh; ++i, ++txep) {
-			rte_pktmbuf_free_seg(txep->mbuf);
-			txep->mbuf = NULL;
+	for (i = 0; i < txq->tx_rs_thresh; ++i, ++txep) {
+		struct rte_mbuf *m;
+
+		/* free buffers one at a time */
+		m = __rte_pktmbuf_prefree_seg(txep->mbuf);
+		txep->mbuf = NULL;
+
+		if (n >= TX_FREE_BULK  ||
+		    (n > 0 && m->pool != txpool)) {
+			rte_mempool_put_bulk(txpool, (void **)free_list, n);
+			n = 0;
 		}
+
+		txpool = m->pool;
+		free_list[n++] = m;
 	}
 
+	if (n > 0)
+		rte_mempool_put_bulk(txpool, (void **)free_list, n);
+
 	/* buffers were freed, update counters */
 	txq->nb_tx_free = (uint16_t)(txq->nb_tx_free + txq->tx_rs_thresh);
 	txq->tx_next_dd = (uint16_t)(txq->tx_next_dd + txq->tx_rs_thresh);

  reply	other threads:[~2015-10-22 16:57 UTC|newest]

Thread overview: 93+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-29 14:45 [PATCH 0/8] virtio: virtio ring layout optimization and RX vector processing Huawei Xie
2015-09-29 14:45 ` [PATCH 1/8] virtio: add configure for simple virtio rx/tx Huawei Xie
2015-09-29 14:45 ` [PATCH 2/8] virtio: add virtio_rxtx.h header file Huawei Xie
2015-09-29 14:45 ` [PATCH 3/8] virtio: add software rx ring, fake_buf, simple_rxtx into virtqueue Huawei Xie
2015-09-29 16:15   ` Stephen Hemminger
2015-09-29 14:45 ` [PATCH 4/8] virtio: rx/tx ring layout optimization Huawei Xie
2015-09-29 14:45 ` [PATCH 5/8] virtio: fill RX avail ring with blank mbufs Huawei Xie
2015-09-29 14:45 ` [PATCH 6/8] virtio: virtio vec rx Huawei Xie
2015-09-29 14:45 ` [PATCH 7/8] virtio: simple tx routine Huawei Xie
2015-09-29 14:45 ` [PATCH 8/8] virtio: rxtx_func_get Huawei Xie
2015-09-29 15:41 ` [PATCH 0/8] virtio: virtio ring layout optimization and RX vector processing Xie, Huawei
2015-10-18  6:28 ` [PATCH v2 0/7] virtio ring layout optimization and simple rx/tx processing Huawei Xie
2015-10-18  6:28 ` Huawei Xie
2015-10-18  6:28   ` [PATCH v2 1/7] virtio: add virtio_rxtx.h header file Huawei Xie
2015-10-18  6:28   ` [PATCH v2 2/7] virtio: add software rx ring, fake_buf into virtqueue Huawei Xie
2015-10-19  4:20     ` Stephen Hemminger
2015-10-19  5:06       ` Xie, Huawei
2015-10-20 15:32         ` Xie, Huawei
2015-10-18  6:29   ` [PATCH v2 3/7] virtio: rx/tx ring layout optimization Huawei Xie
2015-10-18  6:29   ` [PATCH v2 4/7] virtio: fill RX avail ring with blank mbufs Huawei Xie
2015-10-18  6:29   ` [PATCH v2 5/7] virtio: virtio vec rx Huawei Xie
2015-10-18  6:29   ` [PATCH v2 6/7] virtio: simple tx routine Huawei Xie
2015-10-19  4:16     ` Stephen Hemminger
2015-10-19  5:22       ` Xie, Huawei
2015-10-19  4:18     ` Stephen Hemminger
2015-10-19  5:15       ` Xie, Huawei
2015-10-19  4:19     ` Stephen Hemminger
2015-10-19  5:12       ` Xie, Huawei
2015-10-18  6:29   ` [PATCH v2 7/7] virtio: pick simple rx/tx func Huawei Xie
2015-10-20 15:30 ` [PATCH v3 0/7] virtio ring layout optimization and simple rx/tx processing Huawei Xie
2015-10-20 15:30   ` [PATCH v3 1/7] virtio: add virtio_rxtx.h header file Huawei Xie
2015-10-20 15:30   ` [PATCH v3 2/7] virtio: add software rx ring, fake_buf into virtqueue Huawei Xie
2015-10-20 15:30   ` [PATCH v3 3/7] virtio: rx/tx ring layout optimization Huawei Xie
2015-10-20 15:30   ` [PATCH v3 4/7] virtio: fill RX avail ring with blank mbufs Huawei Xie
2015-10-20 15:30   ` [PATCH v3 5/7] virtio: virtio vec rx Huawei Xie
2015-10-22  4:04     ` Wang, Zhihong
2015-10-22  5:48       ` Xie, Huawei
2015-10-20 15:30   ` [PATCH v3 6/7] virtio: simple tx routine Huawei Xie
2015-10-20 18:58     ` Stephen Hemminger
2015-10-22  5:43       ` Xie, Huawei
2015-10-22  2:27     ` Tan, Jianfeng
2015-10-20 15:30   ` [PATCH v3 7/7] virtio: pick simple rx/tx func Huawei Xie
2015-10-22  2:50     ` Tan, Jianfeng
2015-10-22 11:40       ` Xie, Huawei
2015-10-22 12:09 ` [PATCH v4 0/7] virtio ring layout optimization and simple rx/tx processing Huawei Xie
2015-10-22 12:09   ` [PATCH v4 1/7] virtio: add virtio_rxtx.h header file Huawei Xie
2015-10-22 12:09   ` [PATCH v4 2/7] virtio: add software rx ring, fake_buf into virtqueue Huawei Xie
2015-10-22 12:09   ` [PATCH v4 3/7] virtio: rx/tx ring layout optimization Huawei Xie
2015-10-22 12:09   ` [PATCH v4 4/7] virtio: fill RX avail ring with blank mbufs Huawei Xie
2015-10-23  5:56     ` Tan, Jianfeng
2015-10-25 15:40       ` Xie, Huawei
2015-10-22 12:09   ` [PATCH v4 5/7] virtio: virtio vec rx Huawei Xie
2015-10-22 12:09   ` [PATCH v4 6/7] virtio: simple tx routine Huawei Xie
2015-10-22 16:57     ` Stephen Hemminger [this message]
2015-10-23  2:17       ` Xie, Huawei
2015-10-23  2:20         ` Xie, Huawei
2015-10-22 12:09   ` [PATCH v4 7/7] virtio: pick simple rx/tx func Huawei Xie
2015-10-22 16:58     ` Stephen Hemminger
2015-10-23  1:38       ` Xie, Huawei
2015-10-25 15:34 ` [PATCH v5 0/7] virtio ring layout optimization and simple rx/tx processing Huawei Xie
2015-10-25 15:34   ` [PATCH v5 1/7] virtio: add virtio_rxtx.h header file Huawei Xie
2015-10-25 15:34   ` [PATCH v5 2/7] virtio: add software rx ring, fake_buf into virtqueue Huawei Xie
2015-10-25 15:35   ` [PATCH v5 3/7] virtio: rx/tx ring layout optimization Huawei Xie
2015-10-25 15:35   ` [PATCH v5 4/7] virtio: fill RX avail ring with blank mbufs Huawei Xie
2015-10-25 15:35   ` [PATCH v5 5/7] virtio: virtio vec rx Huawei Xie
2015-10-26  8:34     ` Wang, Zhihong
2015-10-25 15:35   ` [PATCH v5 6/7] virtio: simple tx routine Huawei Xie
2015-10-25 15:35   ` [PATCH v5 7/7] virtio: pick simple rx/tx func Huawei Xie
2015-10-27  1:44   ` [PATCH v5 0/7] virtio ring layout optimization and simple rx/tx processing Tan, Jianfeng
2015-10-27  2:15     ` Yuanhan Liu
2015-10-27 10:17       ` Bruce Richardson
2015-10-29 14:53 ` [PATCH v6 0/8] " Huawei Xie
2015-10-29 14:53   ` [PATCH v6 1/8] virtio: add virtio_rxtx.h header file Huawei Xie
2015-10-29 14:53   ` [PATCH v6 2/8] virtio: add software rx ring, fake_buf into virtqueue Huawei Xie
2015-10-30 18:13     ` Thomas Monjalon
2015-10-29 14:53   ` [PATCH v6 3/8] virtio: rx/tx ring layout optimization Huawei Xie
2015-10-29 14:53   ` [PATCH v6 4/8] virtio: fill RX avail ring with blank mbufs Huawei Xie
2015-10-29 14:53   ` [PATCH v6 5/8] virtio: virtio vec rx Huawei Xie
2015-10-30 18:19     ` Thomas Monjalon
2015-11-02  2:18       ` Xie, Huawei
2015-11-02  7:28         ` Thomas Monjalon
2015-11-02  8:49           ` Xie, Huawei
2015-11-02  9:03             ` Thomas Monjalon
2015-10-29 14:53   ` [PATCH v6 6/8] virtio: simple tx routine Huawei Xie
2015-10-29 14:53   ` [PATCH v6 7/8] virtio: pick simple rx/tx func Huawei Xie
2015-10-29 14:53   ` [PATCH v6 8/8] doc: update release notes 2.2 about virtio performance optimization Huawei Xie
2015-10-30  2:05   ` [PATCH v6 0/8] virtio ring layout optimization and simple rx/tx processing Tan, Jianfeng
2015-11-02 22:09     ` Thomas Monjalon
2015-11-02 22:10       ` Thomas Monjalon
2015-11-03 10:30         ` Xie, Huawei
2015-11-27  6:03   ` Xu, Qian Q
2015-12-17  5:22     ` Xie, Huawei
2015-12-17  9:08       ` Thomas Monjalon

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=20151022095730.5a3c742b@xeon-e3 \
    --to=stephen@networkplumber.org \
    --cc=dev@dpdk.org \
    --cc=huawei.xie@intel.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.