DPDK patches and discussions
 help / color / mirror / Atom feed
From: Tiwei Bie <tiwei.bie@intel.com>
To: yliu@fridaylinux.org, maxime.coquelin@redhat.com, dev@dpdk.org
Cc: antonio.fischetti@intel.com, stable@dpdk.org
Subject: [dpdk-dev] [PATCH 1/5] net/virtio: fix vector Rx break caused by rxq flushing
Date: Thu,  7 Dec 2017 13:30:55 +0800	[thread overview]
Message-ID: <20171207053059.19487-2-tiwei.bie@intel.com> (raw)
In-Reply-To: <20171207053059.19487-1-tiwei.bie@intel.com>

The vector Rx will be broken if backend has consumed all
the descs in the avail ring before the device is started.
Because in current implementation, vector Rx will return
immediately without refilling the avail ring if the used
ring is empty. So we have to refill the avail ring after
flushing the elements in the used ring for vector Rx.

Besides, vector Rx has a different ring layout assumption
and mbuf management. So we need to handle it differently.

Fixes: d8227497ec5c ("net/virtio: flush Rx queues on start")
Cc: stable@dpdk.org

Reported-by: Antonio Fischetti <antonio.fischetti@intel.com>
Signed-off-by: Tiwei Bie <tiwei.bie@intel.com>
---
 drivers/net/virtio/virtio_ethdev.c |  2 +-
 drivers/net/virtio/virtqueue.c     | 31 ++++++++++++++++++++++++-------
 drivers/net/virtio/virtqueue.h     |  2 +-
 3 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index e0328f61d..64a0cc608 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -1860,7 +1860,7 @@ virtio_dev_start(struct rte_eth_dev *dev)
 	for (i = 0; i < dev->data->nb_rx_queues; i++) {
 		rxvq = dev->data->rx_queues[i];
 		/* Flush the old packets */
-		virtqueue_flush(rxvq->vq);
+		virtqueue_rxvq_flush(rxvq->vq);
 		virtqueue_notify(rxvq->vq);
 	}
 
diff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c
index c3a536f8a..696d0e4a4 100644
--- a/drivers/net/virtio/virtqueue.c
+++ b/drivers/net/virtio/virtqueue.c
@@ -37,6 +37,7 @@
 #include "virtqueue.h"
 #include "virtio_logs.h"
 #include "virtio_pci.h"
+#include "virtio_rxtx_simple.h"
 
 /*
  * Two types of mbuf to be cleaned:
@@ -62,8 +63,10 @@ virtqueue_detatch_unused(struct virtqueue *vq)
 
 /* Flush the elements in the used ring. */
 void
-virtqueue_flush(struct virtqueue *vq)
+virtqueue_rxvq_flush(struct virtqueue *vq)
 {
+	struct virtnet_rx *rxq = &vq->rxq;
+	struct virtio_hw *hw = vq->hw;
 	struct vring_used_elem *uep;
 	struct vq_desc_extra *dxp;
 	uint16_t used_idx, desc_idx;
@@ -74,13 +77,27 @@ virtqueue_flush(struct virtqueue *vq)
 	for (i = 0; i < nb_used; i++) {
 		used_idx = vq->vq_used_cons_idx & (vq->vq_nentries - 1);
 		uep = &vq->vq_ring.used->ring[used_idx];
-		desc_idx = (uint16_t)uep->id;
-		dxp = &vq->vq_descx[desc_idx];
-		if (dxp->cookie != NULL) {
-			rte_pktmbuf_free(dxp->cookie);
-			dxp->cookie = NULL;
+		if (hw->use_simple_rx) {
+			desc_idx = used_idx;
+			rte_pktmbuf_free(vq->sw_ring[desc_idx]);
+			vq->vq_free_cnt++;
+		} else {
+			desc_idx = (uint16_t)uep->id;
+			dxp = &vq->vq_descx[desc_idx];
+			if (dxp->cookie != NULL) {
+				rte_pktmbuf_free(dxp->cookie);
+				dxp->cookie = NULL;
+			}
+			vq_ring_free_chain(vq, desc_idx);
 		}
 		vq->vq_used_cons_idx++;
-		vq_ring_free_chain(vq, desc_idx);
+	}
+
+	if (hw->use_simple_rx) {
+		while (vq->vq_free_cnt >= RTE_VIRTIO_VPMD_RX_REARM_THRESH) {
+			virtio_rxq_rearm_vec(rxq);
+			if (virtqueue_kick_prepare(vq))
+				virtqueue_notify(vq);
+		}
 	}
 }
diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h
index 2305d91a4..ab466c2db 100644
--- a/drivers/net/virtio/virtqueue.h
+++ b/drivers/net/virtio/virtqueue.h
@@ -304,7 +304,7 @@ void virtqueue_dump(struct virtqueue *vq);
 struct rte_mbuf *virtqueue_detatch_unused(struct virtqueue *vq);
 
 /* Flush the elements in the used ring. */
-void virtqueue_flush(struct virtqueue *vq);
+void virtqueue_rxvq_flush(struct virtqueue *vq);
 
 static inline int
 virtqueue_full(const struct virtqueue *vq)
-- 
2.13.3

  reply	other threads:[~2017-12-07  5:31 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-07  5:30 [dpdk-dev] [PATCH 0/5] various fixes and cleanups for virtio PMD Tiwei Bie
2017-12-07  5:30 ` Tiwei Bie [this message]
2017-12-07  9:14   ` [dpdk-dev] [PATCH 1/5] net/virtio: fix vector Rx break caused by rxq flushing Maxime Coquelin
2017-12-07  9:30     ` Fischetti, Antonio
2017-12-07 18:10       ` Fischetti, Antonio
2017-12-07 16:00   ` Kevin Traynor
2017-12-08  2:30     ` Tiwei Bie
2017-12-08 10:17       ` Kevin Traynor
2017-12-07  5:30 ` [dpdk-dev] [PATCH 2/5] net/virtio: fix typo in LRO support Tiwei Bie
2017-12-07  9:15   ` Maxime Coquelin
2017-12-07  5:30 ` [dpdk-dev] [PATCH 3/5] net/virtio: remove a redundant macro definition for ctrl vq Tiwei Bie
2017-12-07  9:16   ` Maxime Coquelin
2017-12-07  5:30 ` [dpdk-dev] [PATCH 4/5] net/virtio: remove redundant macro definitions for vector Rx Tiwei Bie
2017-12-07  9:18   ` Maxime Coquelin
2017-12-07 10:39     ` Tiwei Bie
2017-12-07  5:30 ` [dpdk-dev] [PATCH 5/5] net/virtio: squeeze repeated blank lines Tiwei Bie
2017-12-07  9:22   ` Maxime Coquelin
2017-12-07 10:32     ` Tiwei Bie
2017-12-11  5:13 ` [dpdk-dev] [PATCH v2 0/4] various fixes and cleanups for virtio PMD Tiwei Bie
2017-12-11  5:13   ` [dpdk-dev] [PATCH v2 1/4] net/virtio: fix vector Rx break caused by rxq flushing Tiwei Bie
2017-12-11  5:13   ` [dpdk-dev] [PATCH v2 2/4] net/virtio: fix typo in LRO support Tiwei Bie
2017-12-11  5:13   ` [dpdk-dev] [PATCH v2 3/4] net/virtio: remove a redundant macro definition for ctrl vq Tiwei Bie
2017-12-11  5:13   ` [dpdk-dev] [PATCH v2 4/4] net/virtio: remove redundant macro definitions for vector Rx Tiwei Bie
2017-12-27 14:46   ` [dpdk-dev] [PATCH v2 0/4] various fixes and cleanups for virtio PMD Yuanhan Liu

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=20171207053059.19487-2-tiwei.bie@intel.com \
    --to=tiwei.bie@intel.com \
    --cc=antonio.fischetti@intel.com \
    --cc=dev@dpdk.org \
    --cc=maxime.coquelin@redhat.com \
    --cc=stable@dpdk.org \
    --cc=yliu@fridaylinux.org \
    /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).