From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 3128BA0559; Mon, 16 Mar 2020 16:13:11 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 22CF31C02C; Mon, 16 Mar 2020 16:13:10 +0100 (CET) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id 3BB531C029 for ; Mon, 16 Mar 2020 16:13:08 +0100 (CET) Received: from Internal Mail-Server by MTLPINE2 (envelope-from asafp@mellanox.com) with ESMTPS (AES256-SHA encrypted); 16 Mar 2020 17:13:05 +0200 Received: from pegasus07.mtr.labs.mlnx (pegasus07.mtr.labs.mlnx [10.210.16.112]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 02GFD5Z9026401; Mon, 16 Mar 2020 17:13:05 +0200 From: Matan Azrad To: dev@dpdk.org Cc: Viacheslav Ovsiienko , Shahaf Shuler , Maxime Coquelin , Xiao Wang , Tiwei Bie Date: Mon, 16 Mar 2020 15:12:53 +0000 Message-Id: <1584371573-4243-1-git-send-email-matan@mellanox.com> X-Mailer: git-send-email 1.8.3.1 Subject: [dpdk-dev] [PATCH] [RFC] vhost: inroduce operation to get vDPA queue stats X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 --- lib/librte_vhost/rte_vdpa.h | 45 +++++++++++++++++++++++++++++++++- lib/librte_vhost/rte_vhost_version.map | 1 + lib/librte_vhost/vdpa.c | 14 +++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) The statistics are very important to reflect some information to the application on traffic. Please review it and comment. Thanks! diff --git a/lib/librte_vhost/rte_vdpa.h b/lib/librte_vhost/rte_vdpa.h index 9a3deb3..595da76 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 recieved_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; +}; + /** * 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); +} -- 1.8.3.1