Hi Maxime Can you point on specific vendor specific counter I suggested? I think all of them come directly from virtio protocols. השג את Outlook עבור Android ________________________________ From: Maxime Coquelin Sent: Wednesday, April 15, 2020 5:36:59 PM To: Matan Azrad ; dev@dpdk.org Cc: Slava Ovsiienko ; Shahaf Shuler Subject: Re: [PATCH 1/4] vhost: inroduce operation to get vDPA queue stats Hi Matan, On 4/2/20 1:26 PM, Matan Azrad wrote: > The vDPA device offloads all the datapath of the vhost device to the HW > device. > > In order to expose to the user traffic information this patch introduce > new API to get traffic statistics per virtio queue. > > The statistics are taken directly from the vDPA driver managing the HW > device. > > Signed-off-by: Matan Azrad > Acked-by: Viacheslav Ovsiienko > --- > doc/guides/rel_notes/release_20_05.rst | 4 +++ > doc/guides/vdpadevs/features/default.ini | 1 + > doc/guides/vdpadevs/features_overview.rst | 3 +++ > lib/librte_vhost/rte_vdpa.h | 45 ++++++++++++++++++++++++++++++- > lib/librte_vhost/rte_vhost_version.map | 1 + > lib/librte_vhost/vdpa.c | 14 ++++++++++ > 6 files changed, 67 insertions(+), 1 deletion(-) ... > diff --git a/lib/librte_vhost/rte_vdpa.h b/lib/librte_vhost/rte_vdpa.h > index 9a3deb3..d6cbf48 100644 > --- a/lib/librte_vhost/rte_vdpa.h > +++ b/lib/librte_vhost/rte_vdpa.h > @@ -37,6 +37,27 @@ struct rte_vdpa_dev_addr { > }; > }; > > +struct rte_vdpa_queue_stats { > + /** Number of descriptors received by device */ > + uint64_t received_desc; > + /** Number of descriptors completed by the device */ > + uint64_t completed_desc; > + /** Number of bad descriptors received by device */ > + uint32_t bad_desc; > + /** > + * Number of chained descriptors received that exceed the max allowed > + * chain by device > + */ > + uint32_t exceed_max_chain; > + /** > + * Number of times device tried to read or write buffer that is not > + * registered to the device > + */ > + uint32_t invalid_buffer; > + /** Number of errors detected by the device */ > + uint32_t errors; > +}; > + I think doing it like that, we risk to keep the rte_vdpa_get_stats API always experimental, as every vendor will want to add their own counters and so break the ABI. How about implementing something similar to rte_eth_xstat? As these stats are for debugging purpose, it would give you much more flexibility in adding new counters as HW or firmwares evolves. What do you think? Thanks, Maxime > /** > * vdpa device operations > */ > @@ -73,8 +94,11 @@ struct rte_vdpa_dev_ops { > int (*get_notify_area)(int vid, int qid, > uint64_t *offset, uint64_t *size); > > + /** Get statistics of the queue */ > + int (*get_stats)(int did, int qid, struct rte_vdpa_queue_stats *stats); > + > /** Reserved for future extension */ > - void *reserved[5]; > + void *reserved[4]; > }; > > /** > @@ -200,4 +224,23 @@ struct rte_vdpa_device * > __rte_experimental > int > rte_vdpa_relay_vring_used(int vid, uint16_t qid, void *vring_m); > + > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change without prior notice > + * > + * Get vDPA device queue statistics. > + * > + * @param did > + * device id > + * @param qid > + * queue id > + * @param stats > + * queue statistics pointer. > + * @return > + * 0 on success, non-zero on failure. > + */ > +__rte_experimental > +int > +rte_vdpa_get_stats(int did, uint16_t qid, struct rte_vdpa_queue_stats *stats); > #endif /* _RTE_VDPA_H_ */ > diff --git a/lib/librte_vhost/rte_vhost_version.map b/lib/librte_vhost/rte_vhost_version.map > index 051d08c..c9dcff4 100644 > --- a/lib/librte_vhost/rte_vhost_version.map > +++ b/lib/librte_vhost/rte_vhost_version.map > @@ -38,6 +38,7 @@ EXPERIMENTAL { > rte_vdpa_find_device_id; > rte_vdpa_get_device; > rte_vdpa_get_device_num; > + rte_vdpa_get_stats; > rte_vhost_driver_attach_vdpa_device; > rte_vhost_driver_detach_vdpa_device; > rte_vhost_driver_get_vdpa_device_id; > diff --git a/lib/librte_vhost/vdpa.c b/lib/librte_vhost/vdpa.c > index 2b86708..57900fc 100644 > --- a/lib/librte_vhost/vdpa.c > +++ b/lib/librte_vhost/vdpa.c > @@ -227,3 +227,17 @@ struct rte_vdpa_device * > free_ind_table(idesc); > return -1; > } > + > +int > +rte_vdpa_get_stats(int did, uint16_t qid, struct rte_vdpa_queue_stats *stats) > +{ > + struct rte_vdpa_device *vdpa_dev; > + > + vdpa_dev = rte_vdpa_get_device(did); > + if (!vdpa_dev) > + return -ENODEV; > + > + RTE_FUNC_PTR_OR_ERR_RET(vdpa_dev->ops->get_stats, -ENOTSUP); > + > + return vdpa_dev->ops->get_stats(did, qid, stats); > +} > השג את Outlook עבור Android