[v3] vhost: add unsafe API to check inflight packets
Checks
Commit Message
In async data path, when vring state changes, it is necessary to
know the number of inflight packets in DMA engine. This patch
provides a thread unsafe API to return the number of inflight
packets without using any lock.
Signed-off-by: Xuan Ding <xuan.ding@intel.com>
---
v3:
* Fixed one typo.
* Revised the doc to be more accuracy.
v2:
* Fixed some format issues.
---
doc/guides/prog_guide/vhost_lib.rst | 5 +++++
doc/guides/rel_notes/release_21_11.rst | 5 +++++
lib/vhost/rte_vhost_async.h | 14 ++++++++++++++
lib/vhost/version.map | 3 +++
lib/vhost/vhost.c | 26 ++++++++++++++++++++++++++
5 files changed, 53 insertions(+)
Comments
On 16/09/2021 03:58, Xuan Ding wrote:
> In async data path, when vring state changes, it is necessary to
> know the number of inflight packets in DMA engine. This patch
> provides a thread unsafe API to return the number of inflight
> packets without using any lock.
>
> Signed-off-by: Xuan Ding <xuan.ding@intel.com>
> ---
> v3:
> * Fixed one typo.
> * Revised the doc to be more accuracy.
>
> v2:
> * Fixed some format issues.
> ---
> doc/guides/prog_guide/vhost_lib.rst | 5 +++++
> doc/guides/rel_notes/release_21_11.rst | 5 +++++
> lib/vhost/rte_vhost_async.h | 14 ++++++++++++++
> lib/vhost/version.map | 3 +++
> lib/vhost/vhost.c | 26 ++++++++++++++++++++++++++
> 5 files changed, 53 insertions(+)
>
<snip>
Should there be a change to the vring_state_changed() in vhost example
app to go along with this patch? It would help to understand the
operation if this API was used.
Hi,
> -----Original Message-----
> From: Kevin Traynor <ktraynor@redhat.com>
> Sent: Wednesday, September 22, 2021 1:28 AM
> To: Ding, Xuan <xuan.ding@intel.com>; dev@dpdk.org;
> maxime.coquelin@redhat.com; Xia, Chenbo <chenbo.xia@intel.com>
> Cc: Hu, Jiayu <jiayu.hu@intel.com>; Jiang, Cheng1 <cheng1.jiang@intel.com>;
> Richardson, Bruce <bruce.richardson@intel.com>; Pai G, Sunil
> <sunil.pai.g@intel.com>; Yang, YvonneX <yvonnex.yang@intel.com>
> Subject: Re: [dpdk-dev] [PATCH v3] vhost: add unsafe API to check inflight
> packets
>
> On 16/09/2021 03:58, Xuan Ding wrote:
> > In async data path, when vring state changes, it is necessary to
> > know the number of inflight packets in DMA engine. This patch
> > provides a thread unsafe API to return the number of inflight
> > packets without using any lock.
> >
> > Signed-off-by: Xuan Ding <xuan.ding@intel.com>
> > ---
> > v3:
> > * Fixed one typo.
> > * Revised the doc to be more accuracy.
> >
> > v2:
> > * Fixed some format issues.
> > ---
> > doc/guides/prog_guide/vhost_lib.rst | 5 +++++
> > doc/guides/rel_notes/release_21_11.rst | 5 +++++
> > lib/vhost/rte_vhost_async.h | 14 ++++++++++++++
> > lib/vhost/version.map | 3 +++
> > lib/vhost/vhost.c | 26 ++++++++++++++++++++++++++
> > 5 files changed, 53 insertions(+)
> >
>
> <snip>
>
> Should there be a change to the vring_state_changed() in vhost example
> app to go along with this patch? It would help to understand the
> operation if this API was used.
Thanks Kevin, will add it in vhost example in next version.
Regards,
Xuan
@@ -305,6 +305,11 @@ The following is an overview of some key Vhost API functions:
This function returns the amount of in-flight packets for the vhost
queue using async acceleration.
+* ``rte_vhost_async_get_inflight_thread_unsafe(vid, queue_id)``
+
+ Get the number of inflight packets for a vhost queue without
+ performing any locking.
+
* ``rte_vhost_clear_queue_thread_unsafe(vid, queue_id, **pkts, count)``
Clear inflight packets which are submitted to DMA engine in vhost async data
@@ -55,6 +55,11 @@ New Features
Also, make sure to start the actual text at the margin.
=======================================================
+* **Added vhost API to get the number of inflight packets.**
+
+ Added an API which can get the number of inflight packets in
+ vhost async data path without using lock.
+
* **Enabled new devargs parser.**
* Enabled devargs syntax
@@ -246,6 +246,20 @@ uint16_t rte_vhost_poll_enqueue_completed(int vid, uint16_t queue_id,
__rte_experimental
int rte_vhost_async_get_inflight(int vid, uint16_t queue_id);
+/**
+ * This function is lock-free version to return the amount of in-flight
+ * packets for the vhost queue which uses async channel acceleration.
+ *
+ * @param vid
+ * id of vhost device to enqueue data
+ * @param queue_id
+ * queue id to enqueue data
+ * @return
+ * the amount of in-flight packets on success; -1 on failure
+ */
+__rte_experimental
+int rte_vhost_async_get_inflight_thread_unsafe(int vid, uint16_t queue_id);
+
/**
* This function checks async completion status and clear packets for
* a specific vhost device queue. Packets which are inflight will be
@@ -85,4 +85,7 @@ EXPERIMENTAL {
rte_vhost_async_channel_register_thread_unsafe;
rte_vhost_async_channel_unregister_thread_unsafe;
rte_vhost_clear_queue_thread_unsafe;
+
+ #added in 21.11
+ rte_vhost_async_get_inflight_thread_unsafe;
};
@@ -1886,5 +1886,31 @@ int rte_vhost_async_get_inflight(int vid, uint16_t queue_id)
return ret;
}
+int
+rte_vhost_async_get_inflight_thread_unsafe(int vid, uint16_t queue_id)
+{
+ struct vhost_virtqueue *vq;
+ struct virtio_net *dev = get_device(vid);
+ int ret = -1;
+
+ if (dev == NULL)
+ return ret;
+
+ if (queue_id >= VHOST_MAX_VRING)
+ return ret;
+
+ vq = dev->virtqueue[queue_id];
+
+ if (vq == NULL)
+ return ret;
+
+ if (!vq->async_registered)
+ return ret;
+
+ ret = vq->async_pkts_inflight_n;
+
+ return ret;
+}
+
RTE_LOG_REGISTER_SUFFIX(vhost_config_log_level, config, INFO);
RTE_LOG_REGISTER_SUFFIX(vhost_data_log_level, data, WARNING);