All of lore.kernel.org
 help / color / mirror / Atom feed
From: Olivier Matz <olivier.matz@6wind.com>
To: dev@dpdk.org, Yuanhan Liu <yliu@fridaylinux.org>,
	Maxime Coquelin <maxime.coquelin@redhat.com>,
	Tiwei Bie <tiwei.bie@intel.com>
Cc: stable@dpdk.org
Subject: [PATCH v3 1/4] net/virtio: fix queue flushing with vector Rx enabled
Date: Tue, 23 Jan 2018 16:54:40 +0100	[thread overview]
Message-ID: <20180123155443.8883-2-olivier.matz@6wind.com> (raw)
In-Reply-To: <20180123155443.8883-1-olivier.matz@6wind.com>

When using vector Rx mode (use_simple_rx = 1), vq->vq_descx[] is not
kept up to date. To properly detach the mbufs in this case, browse
sw_ring[] instead, as it's done in virtqueue_rxvq_flush().

Since we need virtio_get_queue_type(), also move this function in
virtqueue.h as a static inline.

Fixes: fc3d66212fed ("virtio: add vector Rx")
Cc: stable@dpdk.org

Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
---
 drivers/net/virtio/virtio_ethdev.c | 11 -----------
 drivers/net/virtio/virtqueue.c     | 28 +++++++++++++++++++++++++---
 drivers/net/virtio/virtqueue.h     | 11 +++++++++++
 3 files changed, 36 insertions(+), 14 deletions(-)

diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index 17ac04931..24ffbeeb2 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -279,17 +279,6 @@ virtio_dev_queue_release(void *queue __rte_unused)
 	/* do nothing */
 }
 
-static int
-virtio_get_queue_type(struct virtio_hw *hw, uint16_t vtpci_queue_idx)
-{
-	if (vtpci_queue_idx == hw->max_queue_pairs * 2)
-		return VTNET_CQ;
-	else if (vtpci_queue_idx % 2 == 0)
-		return VTNET_RQ;
-	else
-		return VTNET_TQ;
-}
-
 static uint16_t
 virtio_get_nr_vq(struct virtio_hw *hw)
 {
diff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c
index 1ada4fe08..5a8b21204 100644
--- a/drivers/net/virtio/virtqueue.c
+++ b/drivers/net/virtio/virtqueue.c
@@ -19,16 +19,38 @@ struct rte_mbuf *
 virtqueue_detatch_unused(struct virtqueue *vq)
 {
 	struct rte_mbuf *cookie;
-	int idx;
+	struct virtio_hw *hw;
+	uint16_t start, end;
+	int type, idx;
 
-	if (vq != NULL)
-		for (idx = 0; idx < vq->vq_nentries; idx++) {
+	if (vq == NULL)
+		return NULL;
+
+	hw = vq->hw;
+	type = virtio_get_queue_type(hw, vq->vq_queue_index);
+	start = vq->vq_avail_idx & (vq->vq_nentries - 1);
+	end = (vq->vq_avail_idx + vq->vq_free_cnt) & (vq->vq_nentries - 1);
+
+	for (idx = 0; idx < vq->vq_nentries; idx++) {
+		if (hw->use_simple_rx && type == VTNET_RQ) {
+			if (start <= end && idx >= start && idx < end)
+				continue;
+			if (start > end && (idx >= start || idx < end))
+				continue;
+			cookie = vq->sw_ring[idx];
+			if (cookie != NULL) {
+				vq->sw_ring[idx] = NULL;
+				return cookie;
+			}
+		} else {
 			cookie = vq->vq_descx[idx].cookie;
 			if (cookie != NULL) {
 				vq->vq_descx[idx].cookie = NULL;
 				return cookie;
 			}
 		}
+	}
+
 	return NULL;
 }
 
diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h
index 2d9599218..e46de1583 100644
--- a/drivers/net/virtio/virtqueue.h
+++ b/drivers/net/virtio/virtqueue.h
@@ -292,6 +292,17 @@ virtqueue_full(const struct virtqueue *vq)
 	return vq->vq_free_cnt == 0;
 }
 
+static inline int
+virtio_get_queue_type(struct virtio_hw *hw, uint16_t vtpci_queue_idx)
+{
+	if (vtpci_queue_idx == hw->max_queue_pairs * 2)
+		return VTNET_CQ;
+	else if (vtpci_queue_idx % 2 == 0)
+		return VTNET_RQ;
+	else
+		return VTNET_TQ;
+}
+
 #define VIRTQUEUE_NUSED(vq) ((uint16_t)((vq)->vq_ring.used->idx - (vq)->vq_used_cons_idx))
 
 void vq_ring_free_chain(struct virtqueue *vq, uint16_t desc_idx);
-- 
2.11.0

  reply	other threads:[~2018-01-23 15:54 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-18  9:07 [PATCH 0/3] net/virtio: fix memory leak when reinitializing device Olivier Matz
2018-01-18  9:07 ` [PATCH 1/3] net/virtio: fix typo in function name Olivier Matz
2018-01-18 13:27   ` Yuanhan Liu
2018-01-18 13:45     ` Olivier Matz
2018-01-18 14:06       ` Yuanhan Liu
2018-01-18  9:07 ` [PATCH 2/3] net/virtio: rationalize queue flushing Olivier Matz
2018-01-18 13:26   ` Yuanhan Liu
2018-01-18 13:55     ` Olivier Matz
2018-01-18 14:04       ` Yuanhan Liu
2018-01-18 14:05   ` Tiwei Bie
2018-01-18 14:55     ` Olivier Matz
2018-01-18 15:48       ` Tiwei Bie
2018-01-18 15:56         ` Olivier Matz
2018-01-18  9:07 ` [PATCH 3/3] net/virtio: fix memory leak when reinitializing device Olivier Matz
2018-01-19 15:55 ` [PATCH v2 0/4] " Olivier Matz
2018-01-19 15:55   ` [PATCH v2 1/4] net/virtio: fix queue flushing with vector Rx enabled Olivier Matz
2018-01-22  2:56     ` Tiwei Bie
2018-01-22 10:38       ` Olivier Matz
2018-01-23  2:05         ` Tiwei Bie
2018-01-19 15:55   ` [PATCH v2 2/4] net/virtio: fix memory leak when reinitializing device Olivier Matz
2018-01-19 15:55   ` [PATCH v2 3/4] net/virtio: rationalize queue flushing Olivier Matz
2018-01-19 15:55   ` [PATCH v2 4/4] net/virtio: fix typo in function name Olivier Matz
2018-01-23 15:54   ` [PATCH v3 0/4] net/virtio: fix memory leak when reinitializing device Olivier Matz
2018-01-23 15:54     ` Olivier Matz [this message]
2018-01-23 15:54     ` [PATCH v3 2/4] " Olivier Matz
2018-01-23 15:54     ` [PATCH v3 3/4] net/virtio: rationalize queue flushing Olivier Matz
2018-01-23 15:54     ` [PATCH v3 4/4] net/virtio: fix typo in function name Olivier Matz
2018-01-26 15:34     ` [PATCH v3 0/4] net/virtio: fix memory leak when reinitializing device 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=20180123155443.8883-2-olivier.matz@6wind.com \
    --to=olivier.matz@6wind.com \
    --cc=dev@dpdk.org \
    --cc=maxime.coquelin@redhat.com \
    --cc=stable@dpdk.org \
    --cc=tiwei.bie@intel.com \
    --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 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.