Hi Chenbo, > -----Original Message----- > From: Xia, Chenbo <chenbo....@intel.com> > Sent: Wednesday, September 15, 2021 2:49 PM > To: Ding, Xuan <xuan.d...@intel.com>; dev@dpdk.org; > maxime.coque...@redhat.com > Cc: Hu, Jiayu <jiayu...@intel.com>; cheng.ji...@intel.com; Richardson, Bruce > <bruce.richard...@intel.com>; Pai G, Sunil <sunil.pa...@intel.com> > Subject: RE: [PATCH] vhost: add unsafe API to check inflight packets > > Hi Xuan, > > > -----Original Message----- > > From: Ding, Xuan <xuan.d...@intel.com> > > Sent: Thursday, September 9, 2021 1:58 PM > > To: dev@dpdk.org; maxime.coque...@redhat.com; Xia, Chenbo > > <chenbo....@intel.com> > > Cc: Hu, Jiayu <jiayu...@intel.com>; cheng.ji...@intel.com; Richardson, Bruce > > <bruce.richard...@intel.com>; Pai G, Sunil <sunil.pa...@intel.com>; Ding, > Xuan > > <xuan.d...@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.d...@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