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 <ma...@mellanox.com>
Acked-by: Viacheslav Ovsiienko <viachesl...@mellanox.com>
---
 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/doc/guides/rel_notes/release_20_05.rst 
b/doc/guides/rel_notes/release_20_05.rst
index c960fd2..812d19b 100644
--- a/doc/guides/rel_notes/release_20_05.rst
+++ b/doc/guides/rel_notes/release_20_05.rst
@@ -56,6 +56,10 @@ New Features
      Also, make sure to start the actual text at the margin.
      =========================================================
 
+* **Added vDPA device API to query virtio queue statistics.**
+
+  A new API has been added to query virtio queue statistics from a vDPA device.
+
 * **Updated Mellanox mlx5 driver.**
 
   Updated Mellanox mlx5 driver with new features and improvements, including:
diff --git a/doc/guides/vdpadevs/features/default.ini 
b/doc/guides/vdpadevs/features/default.ini
index 518e4f1..2c122a3 100644
--- a/doc/guides/vdpadevs/features/default.ini
+++ b/doc/guides/vdpadevs/features/default.ini
@@ -37,6 +37,7 @@ proto rarp           =
 proto reply ack      =
 proto host notifier  =
 proto pagefault      =
+queue statistics     =
 BSD nic_uio          =
 Linux VFIO           =
 Other kdrv           =
diff --git a/doc/guides/vdpadevs/features_overview.rst 
b/doc/guides/vdpadevs/features_overview.rst
index eb7eb3b..930bc87 100644
--- a/doc/guides/vdpadevs/features_overview.rst
+++ b/doc/guides/vdpadevs/features_overview.rst
@@ -96,6 +96,9 @@ proto host notifier
 proto pagefault
   Slave expose page-fault FD for migration process.
 
+queue statistics
+  Support virtio queue statistics query.
+
 BSD nic_uio
   BSD ``nic_uio`` module supported.
 
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;
+};
+
 /**
  * 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

Reply via email to