DPDK patches and discussions
 help / color / mirror / Atom feed
* [RFC 0/2] support to clear in-flight packets for async
@ 2022-01-17 13:28 Yuan Wang
  2022-01-17 13:28 ` [RFC 1/2] vhost: support clear in-flight packets for async dequeue Yuan Wang
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Yuan Wang @ 2022-01-17 13:28 UTC (permalink / raw)
  To: maxime.coquelin, chenbo.xia
  Cc: dev, jiayu.hu, xuan.ding, wenwux.ma, yvonnex.yang, yuanx.wang

These patches supports to clear in-flight packets for async dequeue and
introduces thread-safe version of this function.

note: The patches depends on the following patches
(http://patches.dpdk.org/project/dpdk/patch/20220101001244.90147-2-xuan.ding@intel.com/)
(http://patches.dpdk.org/project/dpdk/patch/20220101001244.90147-3-xuan.ding@intel.com/)

Yuan Wang (2):
  vhost: support clear in-flight packets for async dequeue
  example/vhost: support to clear in-flight packets for async dequeue

 doc/guides/prog_guide/vhost_lib.rst    |  7 ++-
 doc/guides/rel_notes/release_22_03.rst |  5 ++
 examples/vhost/main.c                  |  8 +++
 lib/vhost/rte_vhost_async.h            | 26 ++++++++++
 lib/vhost/version.map                  |  1 +
 lib/vhost/virtio_net.c                 | 71 +++++++++++++++++++++++++-
 6 files changed, 115 insertions(+), 3 deletions(-)

-- 
2.25.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [RFC 1/2] vhost: support clear in-flight packets for async dequeue
  2022-01-17 13:28 [RFC 0/2] support to clear in-flight packets for async Yuan Wang
@ 2022-01-17 13:28 ` Yuan Wang
  2022-01-17 13:28 ` [RFC 2/2] example/vhost: support to " Yuan Wang
  2022-03-11 17:34 ` [RFC v2 0/2] support to clear in-flight packets for async Yuan Wang
  2 siblings, 0 replies; 8+ messages in thread
From: Yuan Wang @ 2022-01-17 13:28 UTC (permalink / raw)
  To: maxime.coquelin, chenbo.xia
  Cc: dev, jiayu.hu, xuan.ding, wenwux.ma, yvonnex.yang, yuanx.wang

rte_vhost_clear_queue_thread_unsafe() supports to clear
in-flight packets for async enqueue only. But after
supporting async dequeue, this API should support async dequeue too.

This patch also adds the thread-safe version of this API,
the difference between the two API is that thread safety uses lock.

These APIs maybe used to clean up packets in the async channel
to prevent packet loss when the device state changes or
when the device is destroyed.

Signed-off-by: Yuan Wang <yuanx.wang@intel.com>
---
 doc/guides/prog_guide/vhost_lib.rst    |  7 ++-
 doc/guides/rel_notes/release_22_03.rst |  5 ++
 lib/vhost/rte_vhost_async.h            | 26 ++++++++++
 lib/vhost/version.map                  |  1 +
 lib/vhost/virtio_net.c                 | 71 +++++++++++++++++++++++++-
 5 files changed, 107 insertions(+), 3 deletions(-)

diff --git a/doc/guides/prog_guide/vhost_lib.rst b/doc/guides/prog_guide/vhost_lib.rst
index bdce7cbf02..7cea2490e5 100644
--- a/doc/guides/prog_guide/vhost_lib.rst
+++ b/doc/guides/prog_guide/vhost_lib.rst
@@ -269,7 +269,12 @@ The following is an overview of some key Vhost API functions:
 
 * ``rte_vhost_clear_queue_thread_unsafe(vid, queue_id, **pkts, count, dma_id, dma_vchan)``
 
-  Clear inflight packets which are submitted to DMA engine in vhost async data
+  Clear in-flight packets which are submitted to async channel in vhost
+  async data path without performing any locking. Completed packets are
+  returned to applications through ``pkts``.
+
+* ``rte_vhost_clear_queue(vid, queue_id, **pkts, count, dma_id, dma_vchan)``
+  Clear in-flight packets which are submitted to async channel in vhost async data
   path. Completed packets are returned to applications through ``pkts``.
 
 Vhost-user Implementations
diff --git a/doc/guides/rel_notes/release_22_03.rst b/doc/guides/rel_notes/release_22_03.rst
index 6d99d1eaa9..e774919fc9 100644
--- a/doc/guides/rel_notes/release_22_03.rst
+++ b/doc/guides/rel_notes/release_22_03.rst
@@ -55,6 +55,11 @@ New Features
      Also, make sure to start the actual text at the margin.
      =======================================================
 
+* **Added thread-safe version of inflight packet clear API in vhost library.**
+
+  Added an API which can clear the inflight packets submitted to
+  the async channel in a thread-safe manner in the vhost async data path.
+
 
 Removed Items
 -------------
diff --git a/lib/vhost/rte_vhost_async.h b/lib/vhost/rte_vhost_async.h
index b1249382cd..ed9389560b 100644
--- a/lib/vhost/rte_vhost_async.h
+++ b/lib/vhost/rte_vhost_async.h
@@ -186,6 +186,32 @@ __rte_experimental
 uint16_t rte_vhost_clear_queue_thread_unsafe(int vid, uint16_t queue_id,
 		struct rte_mbuf **pkts, uint16_t count, int16_t dma_id,
 		uint16_t vchan);
+
+/**
+ * This function checks async completion status and clear packets for
+ * a specific vhost device queue. Packets which are inflight will be
+ * returned in an array.
+ *
+ * @param vid
+ *  ID of vhost device to clear data
+ * @param queue_id
+ *  Queue id to clear data
+ * @param pkts
+ *  Blank array to get return packet pointer
+ * @param count
+ *  Size of the packet array
+ * @param dma_id
+ *  the identifier of the DMA device
+ * @param vchan
+ *  the identifier of virtual DMA channel
+ * @return
+ *  Number of packets returned
+ */
+__rte_experimental
+uint16_t rte_vhost_clear_queue(int vid, uint16_t queue_id,
+		struct rte_mbuf **pkts,	uint16_t count,	int16_t dma_id,
+		uint16_t vchan);
+
 /**
  * The DMA vChannels used in asynchronous data path must be configured
  * first. So this function needs to be called before enabling DMA
diff --git a/lib/vhost/version.map b/lib/vhost/version.map
index 816a6dc942..16f7d57380 100644
--- a/lib/vhost/version.map
+++ b/lib/vhost/version.map
@@ -88,6 +88,7 @@ EXPERIMENTAL {
 	# added in 22.03
 	rte_vhost_async_dma_configure;
 	rte_vhost_async_try_dequeue_burst;
+	rte_vhost_clear_queue;
 };
 
 INTERNAL {
diff --git a/lib/vhost/virtio_net.c b/lib/vhost/virtio_net.c
index 148709f2c5..510cd6ca8a 100644
--- a/lib/vhost/virtio_net.c
+++ b/lib/vhost/virtio_net.c
@@ -26,6 +26,11 @@
 
 #define MAX_BATCH_LEN 256
 
+static __rte_always_inline uint16_t
+async_poll_dequeue_completed_split(struct virtio_net *dev, uint16_t queue_id,
+		struct rte_mbuf **pkts, uint16_t count, uint16_t dma_id, uint16_t dma_vchan,
+		bool legacy_ol_flags);
+
 /* DMA device copy operation tracking array. */
 struct async_dma_info dma_copy_track[RTE_DMADEV_DEFAULT_MAX];
 
@@ -2042,7 +2047,49 @@ rte_vhost_clear_queue_thread_unsafe(int vid, uint16_t queue_id,
 		return 0;
 
 	VHOST_LOG_DATA(DEBUG, "(%d) %s\n", dev->vid, __func__);
-	if (unlikely(!is_valid_virt_queue_idx(queue_id, 0, dev->nr_vring))) {
+	if (unlikely(queue_id >= dev->nr_vring)) {
+		VHOST_LOG_DATA(ERR, "(%d) %s: invalid virtqueue idx %d.\n",
+				dev->vid, __func__, queue_id);
+		return 0;
+	}
+
+	vq = dev->virtqueue[queue_id];
+
+	if (unlikely(!vq->async)) {
+		VHOST_LOG_DATA(ERR, "(%d) %s: async not registered for queue id %d.\n",
+			dev->vid, __func__, queue_id);
+		return 0;
+	}
+
+	if (queue_id % 2 == 0)
+		n_pkts_cpl = vhost_poll_enqueue_completed(dev, queue_id,
+					pkts, count, dma_id, vchan);
+	else {
+		if (unlikely(vq_is_packed(dev)))
+			VHOST_LOG_DATA(ERR,
+					"(%d) %s: async dequeue does not support packed ring.\n",
+					dev->vid, __func__);
+		else
+			n_pkts_cpl = async_poll_dequeue_completed_split(dev, queue_id, pkts, count,
+					dma_id, vchan, dev->flags & VIRTIO_DEV_LEGACY_OL_FLAGS);
+	}
+
+	return n_pkts_cpl;
+}
+
+uint16_t
+rte_vhost_clear_queue(int vid, uint16_t queue_id, struct rte_mbuf **pkts,
+		uint16_t count,	int16_t dma_id,	uint16_t vchan)
+{
+	struct virtio_net *dev = get_device(vid);
+	struct vhost_virtqueue *vq;
+	uint16_t n_pkts_cpl = 0;
+
+	if (!dev)
+		return 0;
+
+	VHOST_LOG_DATA(DEBUG, "(%d) %s\n", dev->vid, __func__);
+	if (unlikely(queue_id >= dev->nr_vring)) {
 		VHOST_LOG_DATA(ERR, "(%d) %s: invalid virtqueue idx %d.\n",
 			dev->vid, __func__, queue_id);
 		return 0;
@@ -2056,7 +2103,27 @@ rte_vhost_clear_queue_thread_unsafe(int vid, uint16_t queue_id,
 		return 0;
 	}
 
-	n_pkts_cpl = vhost_poll_enqueue_completed(dev, queue_id, pkts, count, dma_id, vchan);
+	if (!rte_spinlock_trylock(&vq->access_lock)) {
+		VHOST_LOG_DATA(ERR,
+			"(%d) %s: failed to clear async queue id %d, virtqueue busy.\n",
+			dev->vid, __func__, queue_id);
+		return 0;
+	}
+
+	if (queue_id % 2 == 0)
+		n_pkts_cpl = vhost_poll_enqueue_completed(dev, queue_id,
+					pkts, count, dma_id, vchan);
+	else {
+		if (unlikely(vq_is_packed(dev)))
+			VHOST_LOG_DATA(ERR,
+				"(%d) %s: async dequeue does not support packed ring.\n",
+				dev->vid, __func__);
+		else
+			n_pkts_cpl = async_poll_dequeue_completed_split(dev, queue_id, pkts, count,
+					dma_id, vchan, dev->flags & VIRTIO_DEV_LEGACY_OL_FLAGS);
+	}
+
+	rte_spinlock_unlock(&vq->access_lock);
 
 	return n_pkts_cpl;
 }
-- 
2.25.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [RFC 2/2] example/vhost: support to clear in-flight packets for async dequeue
  2022-01-17 13:28 [RFC 0/2] support to clear in-flight packets for async Yuan Wang
  2022-01-17 13:28 ` [RFC 1/2] vhost: support clear in-flight packets for async dequeue Yuan Wang
@ 2022-01-17 13:28 ` Yuan Wang
  2022-03-11 17:34 ` [RFC v2 0/2] support to clear in-flight packets for async Yuan Wang
  2 siblings, 0 replies; 8+ messages in thread
From: Yuan Wang @ 2022-01-17 13:28 UTC (permalink / raw)
  To: maxime.coquelin, chenbo.xia
  Cc: dev, jiayu.hu, xuan.ding, wenwux.ma, yvonnex.yang, yuanx.wang

This patch allows vhost_clear_queue_thread_unsafe() to clear
in-flight dequeue packets.

Signed-off-by: Yuan Wang <yuanx.wang@intel.com>
---
 examples/vhost/main.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/examples/vhost/main.c b/examples/vhost/main.c
index 04a85262bc..050f983fd6 100644
--- a/examples/vhost/main.c
+++ b/examples/vhost/main.c
@@ -1495,6 +1495,7 @@ vhost_clear_queue_thread_unsafe(struct vhost_dev *vdev, uint16_t queue_id)
 	uint16_t n_pkt = 0;
 	uint16_t dma_id = dma_bind[vid2socketid[vdev->vid]].dmas[queue_id].dev_id;
 	struct rte_mbuf *m_enq_cpl[vdev->pkts_enq_inflight];
+	struct rte_mbuf *m_deq_cpl[vdev->pkts_deq_inflight];
 
 	if (queue_id % 2 == 0) {
 		while (vdev->pkts_enq_inflight) {
@@ -1503,6 +1504,13 @@ vhost_clear_queue_thread_unsafe(struct vhost_dev *vdev, uint16_t queue_id)
 			free_pkts(m_enq_cpl, n_pkt);
 			__atomic_sub_fetch(&vdev->pkts_enq_inflight, n_pkt, __ATOMIC_SEQ_CST);
 		}
+	} else {
+		while (vdev->pkts_deq_inflight) {
+			n_pkt = rte_vhost_clear_queue_thread_unsafe(vdev->vid,
+				queue_id, m_deq_cpl, vdev->pkts_deq_inflight, dma_id, 0);
+			free_pkts(m_deq_cpl, n_pkt);
+			__atomic_sub_fetch(&vdev->pkts_deq_inflight, n_pkt, __ATOMIC_SEQ_CST);
+		}
 	}
 }
 
-- 
2.25.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [RFC v2 0/2] support to clear in-flight packets for async
  2022-01-17 13:28 [RFC 0/2] support to clear in-flight packets for async Yuan Wang
  2022-01-17 13:28 ` [RFC 1/2] vhost: support clear in-flight packets for async dequeue Yuan Wang
  2022-01-17 13:28 ` [RFC 2/2] example/vhost: support to " Yuan Wang
@ 2022-03-11 17:34 ` Yuan Wang
  2022-03-11 17:34   ` [RFC v2 1/2] vhost: support clear in-flight packets for async dequeue Yuan Wang
  2022-03-11 17:34   ` [RFC v2 2/2] example/vhost: support to " Yuan Wang
  2 siblings, 2 replies; 8+ messages in thread
From: Yuan Wang @ 2022-03-11 17:34 UTC (permalink / raw)
  To: maxime.coquelin, chenbo.xia
  Cc: dev, jiayu.hu, xuan.ding, yvonnex.yang, sunil.pai.g, yuanx.wang

These patches support to clear in-flight packets for async dequeue
and introduce thread-safe version of this function.

note: The patches depend on the following patches
(http://patches.dpdk.org/project/dpdk/patch/20220310065407.17145-2-xuan.ding@intel.com/)
(http://patches.dpdk.org/project/dpdk/patch/20220310065407.17145-3-xuan.ding@intel.com/)
---
v2:
- rebase to 22.03-rc3.

Yuan Wang (2):
  vhost: support clear in-flight packets for async dequeue
  example/vhost: support to clear in-flight packets for async dequeue

 doc/guides/prog_guide/vhost_lib.rst    |  7 ++-
 doc/guides/rel_notes/release_22_03.rst |  4 ++
 examples/vhost/main.c                  |  3 -
 lib/vhost/rte_vhost_async.h            | 25 ++++++++
 lib/vhost/version.map                  |  1 +
 lib/vhost/virtio_net.c                 | 79 +++++++++++++++++++++++++-
 6 files changed, 113 insertions(+), 6 deletions(-)

-- 
2.25.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [RFC v2 1/2] vhost: support clear in-flight packets for async dequeue
  2022-03-11 17:34 ` [RFC v2 0/2] support to clear in-flight packets for async Yuan Wang
@ 2022-03-11 17:34   ` Yuan Wang
  2022-03-28  6:08     ` Pai G, Sunil
  2022-03-11 17:34   ` [RFC v2 2/2] example/vhost: support to " Yuan Wang
  1 sibling, 1 reply; 8+ messages in thread
From: Yuan Wang @ 2022-03-11 17:34 UTC (permalink / raw)
  To: maxime.coquelin, chenbo.xia
  Cc: dev, jiayu.hu, xuan.ding, yvonnex.yang, sunil.pai.g, yuanx.wang

rte_vhost_clear_queue_thread_unsafe() supports to clear
in-flight packets for async enqueue only. But after
supporting async dequeue, this API should support async dequeue too.

This patch also adds the thread-safe version of this API,
the difference between the two API is that thread safety uses lock.

These APIs maybe used to clean up packets in the async channel
to prevent packet loss when the device state changes or
when the device is destroyed.

Signed-off-by: Yuan Wang <yuanx.wang@intel.com>
---
 doc/guides/prog_guide/vhost_lib.rst    |  7 ++-
 doc/guides/rel_notes/release_22_03.rst |  4 ++
 lib/vhost/rte_vhost_async.h            | 25 ++++++++
 lib/vhost/version.map                  |  1 +
 lib/vhost/virtio_net.c                 | 79 +++++++++++++++++++++++++-
 5 files changed, 113 insertions(+), 3 deletions(-)

diff --git a/doc/guides/prog_guide/vhost_lib.rst b/doc/guides/prog_guide/vhost_lib.rst
index 886f8f5e72..bbb7333d03 100644
--- a/doc/guides/prog_guide/vhost_lib.rst
+++ b/doc/guides/prog_guide/vhost_lib.rst
@@ -273,7 +273,12 @@ The following is an overview of some key Vhost API functions:
 
 * ``rte_vhost_clear_queue_thread_unsafe(vid, queue_id, **pkts, count, dma_id, vchan_id)``
 
-  Clear inflight packets which are submitted to DMA engine in vhost async data
+  Clear in-flight packets which are submitted to async channel in vhost
+  async data path without performing any locking. Completed packets are
+  returned to applications through ``pkts``.
+
+* ``rte_vhost_clear_queue(vid, queue_id, **pkts, count, dma_id, vchan_id)``
+  Clear in-flight packets which are submitted to async channel in vhost async data
   path. Completed packets are returned to applications through ``pkts``.
 
 Vhost-user Implementations
diff --git a/doc/guides/rel_notes/release_22_03.rst b/doc/guides/rel_notes/release_22_03.rst
index 60e5b4f9aa..ab754056b9 100644
--- a/doc/guides/rel_notes/release_22_03.rst
+++ b/doc/guides/rel_notes/release_22_03.rst
@@ -232,6 +232,10 @@ New Features
   * Crypto producer mode helps to measure performance of OP_NEW and OP_FORWARD
     modes of event crypto adapter.
 
+* **Added thread-safe version of inflight packet clear API in vhost library.**
+
+  * Added an API which can clear the inflight packets submitted to
+    the async channel in a thread-safe manner in the vhost async data path.
 
 Removed Items
 -------------
diff --git a/lib/vhost/rte_vhost_async.h b/lib/vhost/rte_vhost_async.h
index b6ab0b06a2..eb1ddb2ec1 100644
--- a/lib/vhost/rte_vhost_async.h
+++ b/lib/vhost/rte_vhost_async.h
@@ -166,6 +166,31 @@ uint16_t rte_vhost_clear_queue_thread_unsafe(int vid, uint16_t queue_id,
 		struct rte_mbuf **pkts, uint16_t count, int16_t dma_id,
 		uint16_t vchan_id);
 
+/**
+ * This function checks async completion status and clear packets for
+ * a specific vhost device queue. Packets which are inflight will be
+ * returned in an array.
+ *
+ * @param vid
+ *  ID of vhost device to clear data
+ * @param queue_id
+ *  Queue id to clear data
+ * @param pkts
+ *  Blank array to get return packet pointer
+ * @param count
+ *  Size of the packet array
+ * @param dma_id
+ *  The identifier of the DMA device
+ * @param vchan_id
+ *  The identifier of virtual DMA channel
+ * @return
+ *  Number of packets returned
+ */
+__rte_experimental
+uint16_t rte_vhost_clear_queue(int vid, uint16_t queue_id,
+		struct rte_mbuf **pkts, uint16_t count, int16_t dma_id,
+		uint16_t vchan_id);
+
 /**
  * The DMA vChannels used in asynchronous data path must be configured
  * first. So this function needs to be called before enabling DMA
diff --git a/lib/vhost/version.map b/lib/vhost/version.map
index 968d6d4290..11c5fa635d 100644
--- a/lib/vhost/version.map
+++ b/lib/vhost/version.map
@@ -88,6 +88,7 @@ EXPERIMENTAL {
 	# added in 22.03
 	rte_vhost_async_dma_configure;
 	rte_vhost_async_try_dequeue_burst;
+	rte_vhost_clear_queue;
 };
 
 INTERNAL {
diff --git a/lib/vhost/virtio_net.c b/lib/vhost/virtio_net.c
index 3816caca79..ca96632ee5 100644
--- a/lib/vhost/virtio_net.c
+++ b/lib/vhost/virtio_net.c
@@ -26,6 +26,11 @@
 
 #define MAX_BATCH_LEN 256
 
+static __rte_always_inline uint16_t
+async_poll_dequeue_completed_split(struct virtio_net *dev, uint16_t queue_id,
+		struct rte_mbuf **pkts, uint16_t count, uint16_t dma_id,
+		uint16_t vchan_id, bool legacy_ol_flags);
+
 /* DMA device copy operation tracking array. */
 struct async_dma_info dma_copy_track[RTE_DMADEV_DEFAULT_MAX];
 
@@ -2083,7 +2088,7 @@ rte_vhost_clear_queue_thread_unsafe(int vid, uint16_t queue_id,
 		return 0;
 
 	VHOST_LOG_DATA(DEBUG, "(%s) %s\n", dev->ifname, __func__);
-	if (unlikely(!is_valid_virt_queue_idx(queue_id, 0, dev->nr_vring))) {
+	if (unlikely(queue_id >= dev->nr_vring)) {
 		VHOST_LOG_DATA(ERR, "(%s) %s: invalid virtqueue idx %d.\n",
 			dev->ifname, __func__, queue_id);
 		return 0;
@@ -2104,11 +2109,81 @@ rte_vhost_clear_queue_thread_unsafe(int vid, uint16_t queue_id,
 		return 0;
 	}
 
-	n_pkts_cpl = vhost_poll_enqueue_completed(dev, queue_id, pkts, count, dma_id, vchan_id);
+	if (queue_id % 2 == 0)
+		n_pkts_cpl = vhost_poll_enqueue_completed(dev, queue_id,
+					pkts, count, dma_id, vchan_id);
+	else {
+		if (unlikely(vq_is_packed(dev)))
+			VHOST_LOG_DATA(ERR,
+					"(%d) %s: async dequeue does not support packed ring.\n",
+					dev->vid, __func__);
+		else
+			n_pkts_cpl = async_poll_dequeue_completed_split(dev, queue_id, pkts, count,
+					dma_id, vchan_id, dev->flags & VIRTIO_DEV_LEGACY_OL_FLAGS);
+	}
+
+	return n_pkts_cpl;
+}
+
+uint16_t
+rte_vhost_clear_queue(int vid, uint16_t queue_id, struct rte_mbuf **pkts,
+		uint16_t count, int16_t dma_id, uint16_t vchan_id)
+{
+	struct virtio_net *dev = get_device(vid);
+	struct vhost_virtqueue *vq;
+	uint16_t n_pkts_cpl = 0;
+
+	if (!dev)
+		return 0;
+
+	VHOST_LOG_DATA(DEBUG, "(%s) %s\n", dev->ifname, __func__);
+	if (unlikely(queue_id >= dev->nr_vring)) {
+		VHOST_LOG_DATA(ERR, "(%s) %s: invalid virtqueue idx %d.\n",
+			dev->ifname, __func__, queue_id);
+		return 0;
+	}
+
+	vq = dev->virtqueue[queue_id];
+
+	if (unlikely(!vq->async)) {
+		VHOST_LOG_DATA(ERR, "(%s) %s: async not registered for queue id %d.\n",
+			dev->ifname, __func__, queue_id);
+		return 0;
+	}
+
+	if (unlikely(!dma_copy_track[dma_id].vchans ||
+				!dma_copy_track[dma_id].vchans[vchan_id].pkts_cmpl_flag_addr)) {
+		VHOST_LOG_DATA(ERR, "(%s) %s: invalid channel %d:%u.\n", dev->ifname, __func__,
+				dma_id, vchan_id);
+		return 0;
+	}
+
+	if (!rte_spinlock_trylock(&vq->access_lock)) {
+		VHOST_LOG_DATA(ERR,
+			"(%d) %s: failed to clear async queue id %d, virtqueue busy.\n",
+			dev->vid, __func__, queue_id);
+		return 0;
+	}
+
+	if (queue_id % 2 == 0)
+		n_pkts_cpl = vhost_poll_enqueue_completed(dev, queue_id,
+					pkts, count, dma_id, vchan_id);
+	else {
+		if (unlikely(vq_is_packed(dev)))
+			VHOST_LOG_DATA(ERR,
+					"(%d) %s: async dequeue does not support packed ring.\n",
+					dev->vid, __func__);
+		else
+			n_pkts_cpl = async_poll_dequeue_completed_split(dev, queue_id, pkts, count,
+					dma_id, vchan_id, dev->flags & VIRTIO_DEV_LEGACY_OL_FLAGS);
+	}
+
+	rte_spinlock_unlock(&vq->access_lock);
 
 	return n_pkts_cpl;
 }
 
+
 static __rte_always_inline uint32_t
 virtio_dev_rx_async_submit(struct virtio_net *dev, uint16_t queue_id,
 	struct rte_mbuf **pkts, uint32_t count, int16_t dma_id, uint16_t vchan_id)
-- 
2.25.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [RFC v2 2/2] example/vhost: support to clear in-flight packets for async dequeue
  2022-03-11 17:34 ` [RFC v2 0/2] support to clear in-flight packets for async Yuan Wang
  2022-03-11 17:34   ` [RFC v2 1/2] vhost: support clear in-flight packets for async dequeue Yuan Wang
@ 2022-03-11 17:34   ` Yuan Wang
  1 sibling, 0 replies; 8+ messages in thread
From: Yuan Wang @ 2022-03-11 17:34 UTC (permalink / raw)
  To: maxime.coquelin, chenbo.xia
  Cc: dev, jiayu.hu, xuan.ding, yvonnex.yang, sunil.pai.g, yuanx.wang

This patch allows vring_state_changed() to clear
in-flight dequeue packets.

Signed-off-by: Yuan Wang <yuanx.wang@intel.com>
---
 examples/vhost/main.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/examples/vhost/main.c b/examples/vhost/main.c
index d26e40ab73..04e7821322 100644
--- a/examples/vhost/main.c
+++ b/examples/vhost/main.c
@@ -1767,9 +1767,6 @@ vring_state_changed(int vid, uint16_t queue_id, int enable)
 	if (!vdev)
 		return -1;
 
-	if (queue_id != VIRTIO_RXQ)
-		return 0;
-
 	if (dma_bind[vid2socketid[vid]].dmas[queue_id].async_enabled) {
 		if (!enable)
 			vhost_clear_queue_thread_unsafe(vdev, queue_id);
-- 
2.25.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [RFC v2 1/2] vhost: support clear in-flight packets for async dequeue
  2022-03-11 17:34   ` [RFC v2 1/2] vhost: support clear in-flight packets for async dequeue Yuan Wang
@ 2022-03-28  6:08     ` Pai G, Sunil
  2022-03-29  9:51       ` Wang, YuanX
  0 siblings, 1 reply; 8+ messages in thread
From: Pai G, Sunil @ 2022-03-28  6:08 UTC (permalink / raw)
  To: Wang, YuanX, maxime.coquelin, Xia, Chenbo
  Cc: dev, Hu, Jiayu, Ding, Xuan, Yang, YvonneX

Hi Yuan,

Thanks for the patch, comment inline.

> +uint16_t
> +rte_vhost_clear_queue(int vid, uint16_t queue_id, struct rte_mbuf **pkts,
> +		uint16_t count, int16_t dma_id, uint16_t vchan_id) {
> +	struct virtio_net *dev = get_device(vid);
> +	struct vhost_virtqueue *vq;
> +	uint16_t n_pkts_cpl = 0;
> +
> +	if (!dev)
> +		return 0;
> +
> +	VHOST_LOG_DATA(DEBUG, "(%s) %s\n", dev->ifname, __func__);
> +	if (unlikely(queue_id >= dev->nr_vring)) {
> +		VHOST_LOG_DATA(ERR, "(%s) %s: invalid virtqueue idx %d.\n",
> +			dev->ifname, __func__, queue_id);
> +		return 0;
> +	}
> +
> +	vq = dev->virtqueue[queue_id];
> +

I think the following checks must be protected by spinlock.
Similar to : https://patches.dpdk.org/project/dpdk/patch/20220328020754.1155063-1-jiayu.hu@intel.com/ 

> +	if (unlikely(!vq->async)) {
> +		VHOST_LOG_DATA(ERR, "(%s) %s: async not registered for queue
> id %d.\n",
> +			dev->ifname, __func__, queue_id);
> +		return 0;
> +	}
> +
> +	if (unlikely(!dma_copy_track[dma_id].vchans ||
> +
> 	!dma_copy_track[dma_id].vchans[vchan_id].pkts_cmpl_flag_addr)) {
> +		VHOST_LOG_DATA(ERR, "(%s) %s: invalid channel %d:%u.\n", dev-
> >ifname, __func__,
> +				dma_id, vchan_id);
> +		return 0;
> +	}
> +
> +	if (!rte_spinlock_trylock(&vq->access_lock)) {
> +		VHOST_LOG_DATA(ERR,
> +			"(%d) %s: failed to clear async queue id %d, virtqueue
> busy.\n",
> +			dev->vid, __func__, queue_id);
> +		return 0;
> +	}
> +

<snipped>

Thanks and regards,
Sunil

^ permalink raw reply	[flat|nested] 8+ messages in thread

* RE: [RFC v2 1/2] vhost: support clear in-flight packets for async dequeue
  2022-03-28  6:08     ` Pai G, Sunil
@ 2022-03-29  9:51       ` Wang, YuanX
  0 siblings, 0 replies; 8+ messages in thread
From: Wang, YuanX @ 2022-03-29  9:51 UTC (permalink / raw)
  To: Pai G, Sunil, maxime.coquelin, Xia, Chenbo
  Cc: dev, Hu, Jiayu, Ding, Xuan, Yang, YvonneX

Hi Sunil,

> -----Original Message-----
> From: Pai G, Sunil <sunil.pai.g@intel.com>
> Sent: Monday, March 28, 2022 2:08 PM
> To: Wang, YuanX <yuanx.wang@intel.com>; maxime.coquelin@redhat.com;
> Xia, Chenbo <chenbo.xia@intel.com>
> Cc: dev@dpdk.org; Hu, Jiayu <jiayu.hu@intel.com>; Ding, Xuan
> <xuan.ding@intel.com>; Yang, YvonneX <yvonnex.yang@intel.com>
> Subject: RE: [RFC v2 1/2] vhost: support clear in-flight packets for async
> dequeue
> 
> Hi Yuan,
> 
> Thanks for the patch, comment inline.
> 
> > +uint16_t
> > +rte_vhost_clear_queue(int vid, uint16_t queue_id, struct rte_mbuf
> **pkts,
> > +		uint16_t count, int16_t dma_id, uint16_t vchan_id) {
> > +	struct virtio_net *dev = get_device(vid);
> > +	struct vhost_virtqueue *vq;
> > +	uint16_t n_pkts_cpl = 0;
> > +
> > +	if (!dev)
> > +		return 0;
> > +
> > +	VHOST_LOG_DATA(DEBUG, "(%s) %s\n", dev->ifname, __func__);
> > +	if (unlikely(queue_id >= dev->nr_vring)) {
> > +		VHOST_LOG_DATA(ERR, "(%s) %s: invalid virtqueue
> idx %d.\n",
> > +			dev->ifname, __func__, queue_id);
> > +		return 0;
> > +	}
> > +
> > +	vq = dev->virtqueue[queue_id];
> > +
> 
> I think the following checks must be protected by spinlock.
> Similar to :
> https://patches.dpdk.org/project/dpdk/patch/20220328020754.1155063-1-
> jiayu.hu@intel.com/

Thanks for the comment.
Will fix it in next version.

Thanks,
Yuan

> 
> > +	if (unlikely(!vq->async)) {
> > +		VHOST_LOG_DATA(ERR, "(%s) %s: async not registered for
> queue
> > id %d.\n",
> > +			dev->ifname, __func__, queue_id);
> > +		return 0;
> > +	}
> > +
> > +	if (unlikely(!dma_copy_track[dma_id].vchans ||
> > +
> > 	!dma_copy_track[dma_id].vchans[vchan_id].pkts_cmpl_flag_addr))
> {
> > +		VHOST_LOG_DATA(ERR, "(%s) %s: invalid channel %d:%u.\n",
> dev-
> > >ifname, __func__,
> > +				dma_id, vchan_id);
> > +		return 0;
> > +	}
> > +
> > +	if (!rte_spinlock_trylock(&vq->access_lock)) {
> > +		VHOST_LOG_DATA(ERR,
> > +			"(%d) %s: failed to clear async queue id %d,
> virtqueue
> > busy.\n",
> > +			dev->vid, __func__, queue_id);
> > +		return 0;
> > +	}
> > +
> 
> <snipped>
> 
> Thanks and regards,
> Sunil

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2022-03-29  9:51 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-17 13:28 [RFC 0/2] support to clear in-flight packets for async Yuan Wang
2022-01-17 13:28 ` [RFC 1/2] vhost: support clear in-flight packets for async dequeue Yuan Wang
2022-01-17 13:28 ` [RFC 2/2] example/vhost: support to " Yuan Wang
2022-03-11 17:34 ` [RFC v2 0/2] support to clear in-flight packets for async Yuan Wang
2022-03-11 17:34   ` [RFC v2 1/2] vhost: support clear in-flight packets for async dequeue Yuan Wang
2022-03-28  6:08     ` Pai G, Sunil
2022-03-29  9:51       ` Wang, YuanX
2022-03-11 17:34   ` [RFC v2 2/2] example/vhost: support to " Yuan Wang

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).