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>
---
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 | 25 +++++++++++++++++++++++++
5 files changed, 52 insertions(+)
Comments
Hi Xuan,
> -----Original Message-----
> From: Ding, Xuan <xuan.ding@intel.com>
> Sent: Thursday, September 9, 2021 1:58 PM
> To: dev@dpdk.org; maxime.coquelin@redhat.com; Xia, Chenbo
> <chenbo.xia@intel.com>
> Cc: Hu, Jiayu <jiayu.hu@intel.com>; cheng.jiang@intel.com; Richardson, Bruce
> <bruce.richardson@intel.com>; Pai G, Sunil <sunil.pai.g@intel.com>; Ding, Xuan
> <xuan.ding@intel.com>
> Subject: [PATCH] vhost: add unsafe API to check inflight packets
>
> 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>
> ---
> 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 | 25 +++++++++++++++++++++++++
> 5 files changed, 52 insertions(+)
>
> diff --git a/doc/guides/prog_guide/vhost_lib.rst
> b/doc/guides/prog_guide/vhost_lib.rst
> index 8874033165..b4b1134f54 100644
> --- a/doc/guides/prog_guide/vhost_lib.rst
> +++ b/doc/guides/prog_guide/vhost_lib.rst
> @@ -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)``
This does not align with others. Please check.
>
> Clear inflight packets which are submitted to DMA engine in vhost async
> data
> diff --git a/doc/guides/rel_notes/release_21_11.rst
> b/doc/guides/rel_notes/release_21_11.rst
> index 675b573834..db080e9490 100644
> --- a/doc/guides/rel_notes/release_21_11.rst
> +++ b/doc/guides/rel_notes/release_21_11.rst
> @@ -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.
> +
Please add 'without lock' or something similar as we already have a lock version.
> * **Enabled new devargs parser.**
>
> * Enabled devargs syntax
> diff --git a/lib/vhost/rte_vhost_async.h b/lib/vhost/rte_vhost_async.h
> index b25ff446f7..0af414bf78 100644
> --- a/lib/vhost/rte_vhost_async.h
> +++ b/lib/vhost/rte_vhost_async.h
> @@ -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
You can also check dequeue inflight packets, right?
> + * @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
> diff --git a/lib/vhost/version.map b/lib/vhost/version.map
> index c92a9d4962..b150dc408d 100644
> --- a/lib/vhost/version.map
> +++ b/lib/vhost/version.map
> @@ -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;
> };
> diff --git a/lib/vhost/vhost.c b/lib/vhost/vhost.c
> index 355ff37651..df96f84873 100644
> --- a/lib/vhost/vhost.c
> +++ b/lib/vhost/vhost.c
> @@ -1886,5 +1886,30 @@ 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)
According to DPDK coding style, return type and func name should be in different
lines. I notice there are also some left to clean. May clean in another patch.
Thanks,
Chenbo
> +{
> + 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);
> --
> 2.17.1
Hi Chenbo,
> -----Original Message-----
> From: Xia, Chenbo <chenbo.xia@intel.com>
> Sent: Wednesday, September 15, 2021 2:49 PM
> To: Ding, Xuan <xuan.ding@intel.com>; dev@dpdk.org;
> maxime.coquelin@redhat.com
> Cc: Hu, Jiayu <jiayu.hu@intel.com>; cheng.jiang@intel.com; Richardson, Bruce
> <bruce.richardson@intel.com>; Pai G, Sunil <sunil.pai.g@intel.com>
> Subject: RE: [PATCH] vhost: add unsafe API to check inflight packets
>
> Hi Xuan,
>
> > -----Original Message-----
> > From: Ding, Xuan <xuan.ding@intel.com>
> > Sent: Thursday, September 9, 2021 1:58 PM
> > To: dev@dpdk.org; maxime.coquelin@redhat.com; Xia, Chenbo
> > <chenbo.xia@intel.com>
> > Cc: Hu, Jiayu <jiayu.hu@intel.com>; cheng.jiang@intel.com; Richardson, Bruce
> > <bruce.richardson@intel.com>; Pai G, Sunil <sunil.pai.g@intel.com>; Ding,
> Xuan
> > <xuan.ding@intel.com>
> > Subject: [PATCH] vhost: add unsafe API to check inflight packets
> >
> > 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>
> > ---
> > 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 | 25 +++++++++++++++++++++++++
> > 5 files changed, 52 insertions(+)
> >
> > diff --git a/doc/guides/prog_guide/vhost_lib.rst
> > b/doc/guides/prog_guide/vhost_lib.rst
> > index 8874033165..b4b1134f54 100644
> > --- a/doc/guides/prog_guide/vhost_lib.rst
> > +++ b/doc/guides/prog_guide/vhost_lib.rst
> > @@ -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)``
>
> This does not align with others. Please check.
Thanks, will fix it in next version.
>
> >
> > Clear inflight packets which are submitted to DMA engine in vhost async
> > data
> > diff --git a/doc/guides/rel_notes/release_21_11.rst
> > b/doc/guides/rel_notes/release_21_11.rst
> > index 675b573834..db080e9490 100644
> > --- a/doc/guides/rel_notes/release_21_11.rst
> > +++ b/doc/guides/rel_notes/release_21_11.rst
> > @@ -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.
> > +
>
> Please add 'without lock' or something similar as we already have a lock version.
You are right, add "without lock" is more accuracy.
>
> > * **Enabled new devargs parser.**
> >
> > * Enabled devargs syntax
> > diff --git a/lib/vhost/rte_vhost_async.h b/lib/vhost/rte_vhost_async.h
> > index b25ff446f7..0af414bf78 100644
> > --- a/lib/vhost/rte_vhost_async.h
> > +++ b/lib/vhost/rte_vhost_async.h
> > @@ -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
>
> You can also check dequeue inflight packets, right?
Yes, this API applies to both enqueue and dequeue directions.
>
> > + * @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
> > diff --git a/lib/vhost/version.map b/lib/vhost/version.map
> > index c92a9d4962..b150dc408d 100644
> > --- a/lib/vhost/version.map
> > +++ b/lib/vhost/version.map
> > @@ -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;
> > };
> > diff --git a/lib/vhost/vhost.c b/lib/vhost/vhost.c
> > index 355ff37651..df96f84873 100644
> > --- a/lib/vhost/vhost.c
> > +++ b/lib/vhost/vhost.c
> > @@ -1886,5 +1886,30 @@ 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)
>
> According to DPDK coding style, return type and func name should be in
> different
> lines. I notice there are also some left to clean. May clean in another patch.
Thanks, notice the rte_vhost_async_get_inflight() API also has this problem.
Will fix both in next version.
Regards,
Xuan
>
> Thanks,
> Chenbo
>
> > +{
> > + 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);
> > --
> > 2.17.1
@@ -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.
+
* **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,30 @@ 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);