DPDK patches and discussions
 help / color / mirror / Atom feed
* [PATCH v1] dmadev: add telemetry support
@ 2022-03-23 16:49 Sean Morrissey
  2022-03-25  9:29 ` Pai G, Sunil
                   ` (2 more replies)
  0 siblings, 3 replies; 15+ messages in thread
From: Sean Morrissey @ 2022-03-23 16:49 UTC (permalink / raw)
  To: Chengwen Feng, Kevin Laatz, Bruce Richardson; +Cc: dev, Sean Morrissey

Telemetry commands are now registered through the dmadev library
for the gathering of DSA stats. The corresponding callback
functions for listing dmadevs and providing info and stats for a
specific dmadev are implemented in the dmadev library.

An example usage can be seen below:

Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
{"version": "DPDK 22.03.0-rc2", "pid": 2956551, "max_output_len": 16384}
Connected to application: "dpdk-dma"
--> /
{"/": ["/", "/dmadev/info", "/dmadev/list", "/dmadev/stats", ...]}
--> /dmadev/list
{"/dmadev/list": [0, 1]}
--> /dmadev/info,0
{"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1, "numa_node": 0}}
--> /dmadev/stats,0,0
{"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}}

Signed-off-by: Sean Morrissey <sean.morrissey@intel.com>
---
 doc/guides/prog_guide/dmadev.rst       |  24 ++++++
 doc/guides/rel_notes/release_22_07.rst |   4 +
 lib/dmadev/meson.build                 |   2 +
 lib/dmadev/rte_dmadev.c                | 105 +++++++++++++++++++++++++
 4 files changed, 135 insertions(+)

diff --git a/doc/guides/prog_guide/dmadev.rst b/doc/guides/prog_guide/dmadev.rst
index 77863f8028..1ff66dfe2a 100644
--- a/doc/guides/prog_guide/dmadev.rst
+++ b/doc/guides/prog_guide/dmadev.rst
@@ -118,3 +118,27 @@ i.e. ``rte_dma_stats_get()``. The statistics returned for each device instance a
 * ``submitted``: The number of operations submitted to the device.
 * ``completed``: The number of operations which have completed (successful and failed).
 * ``errors``: The number of operations that completed with error.
+
+The dmadev library has support for displaying DMA device information
+through the Telemetry interface. Telemetry commands that can be used
+are shown below.
+
+#. Get the list of available DMA devices by ID::
+
+     --> /dmadev/list
+     {"/dmadev/list": [0, 1]}
+
+#. Get general information from a DMA device::
+
+     --> /dmadev/info,0
+     {"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1,
+     "numa_node": 0}}
+
+#. Get the statistics for a particular DMA device and virtual DMA channel::
+
+     --> /dmadev/stats,0,0
+     {"/dmadev/stats": {"submitted": 0, "completed": 0,
+     "errors": 0}}
+
+For more information on how to use the Telemetry interface, see
+the :doc:`../howto/telemetry`.
diff --git a/doc/guides/rel_notes/release_22_07.rst b/doc/guides/rel_notes/release_22_07.rst
index 42a5f2d990..5a236b45ae 100644
--- a/doc/guides/rel_notes/release_22_07.rst
+++ b/doc/guides/rel_notes/release_22_07.rst
@@ -55,6 +55,10 @@ New Features
      Also, make sure to start the actual text at the margin.
      =======================================================
 
+* **Added telemetry callbacks to dmadev library.**
+
+  Added telemetry callback functions which allow for a list of DMA devices,
+  stats for a DMA device, and other DMA device information to be queried.
 
 Removed Items
 -------------
diff --git a/lib/dmadev/meson.build b/lib/dmadev/meson.build
index d2fc85e8c7..2f17587b75 100644
--- a/lib/dmadev/meson.build
+++ b/lib/dmadev/meson.build
@@ -5,3 +5,5 @@ sources = files('rte_dmadev.c')
 headers = files('rte_dmadev.h')
 indirect_headers += files('rte_dmadev_core.h')
 driver_sdk_headers += files('rte_dmadev_pmd.h')
+
+deps += ['telemetry']
diff --git a/lib/dmadev/rte_dmadev.c b/lib/dmadev/rte_dmadev.c
index d4b32b2971..2f068cb9d8 100644
--- a/lib/dmadev/rte_dmadev.c
+++ b/lib/dmadev/rte_dmadev.c
@@ -11,6 +11,7 @@
 #include <rte_malloc.h>
 #include <rte_memzone.h>
 #include <rte_string_fns.h>
+#include <rte_telemetry.h>
 
 #include "rte_dmadev.h"
 #include "rte_dmadev_pmd.h"
@@ -864,3 +865,107 @@ dma_fp_object_dummy(struct rte_dma_fp_object *obj)
 	obj->completed_status = dummy_completed_status;
 	obj->burst_capacity   = dummy_burst_capacity;
 }
+
+static int
+dmadev_handle_dev_list(const char *cmd __rte_unused,
+		const char *params __rte_unused,
+		struct rte_tel_data *d)
+{
+	int dev_id;
+
+	if (rte_dma_count_avail() == 0)
+		return -EINVAL;
+
+	rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
+	for (dev_id = 0; dev_id < dma_devices_max; dev_id++)
+		if (rte_dma_is_valid(dev_id))
+			rte_tel_data_add_array_int(d, dev_id);
+
+	return 0;
+}
+
+static int
+dmadev_handle_dev_info(const char *cmd __rte_unused,
+		const char *params, struct rte_tel_data *d)
+{
+	struct rte_dma_info dma_info;
+	int dev_id, ret;
+	char *end_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -EINVAL;
+
+	dev_id = strtoul(params, &end_param, 0);
+	if (*end_param != '\0')
+		RTE_DMA_LOG(ERR,
+		    "Extra parameters passed to dmadev telemetry command, ignoring");
+
+	if (!rte_dma_is_valid(dev_id))
+		return -EINVAL;
+
+	ret = rte_dma_info_get(dev_id, &dma_info);
+	if (ret < 0)
+		return -EINVAL;
+
+	rte_tel_data_start_dict(d);
+	rte_tel_data_add_dict_string(d, "name",
+			dma_info.dev_name);
+	rte_tel_data_add_dict_int(d, "nb_vchans",
+			dma_info.nb_vchans);
+	rte_tel_data_add_dict_int(d, "numa_node",
+			dma_info.numa_node);
+
+	return 0;
+}
+
+#define ADD_DICT_STAT(s) rte_tel_data_add_dict_u64(d, #s, dma_stats.s)
+
+static int
+dmadev_handle_dev_stats(const char *cmd __rte_unused,
+		const char *params,
+		struct rte_tel_data *d)
+{
+	struct rte_dma_stats dma_stats;
+	int dev_id, vchan_id, ret;
+	char *end_param;
+	const char *vchan_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -EINVAL;
+
+	dev_id = strtoul(params, &end_param, 0);
+	vchan_param = strtok(end_param, ",");
+	if (!vchan_param || strlen(vchan_param) == 0 || !isdigit(*vchan_param))
+		return -EINVAL;
+
+	vchan_id = strtoul(vchan_param, &end_param, 0);
+	if (*end_param != '\0')
+		RTE_DMA_LOG(ERR,
+		    "Extra parameters passed to dmadev telemetry command, ignoring");
+
+	if (!rte_dma_is_valid(dev_id))
+		return -EINVAL;
+
+	ret = rte_dma_stats_get(dev_id, vchan_id, &dma_stats);
+	if (ret < 0)
+		return -EINVAL;
+
+	rte_tel_data_start_dict(d);
+	ADD_DICT_STAT(submitted);
+	ADD_DICT_STAT(completed);
+	ADD_DICT_STAT(errors);
+
+	return 0;
+}
+
+RTE_INIT(dmadev_init_telemetry)
+{
+	rte_telemetry_register_cmd("/dmadev/list",
+			dmadev_handle_dev_list,
+			"Returns list of available dmadev devices by IDs. No parameters.");
+	rte_telemetry_register_cmd("/dmadev/info", dmadev_handle_dev_info,
+			"Returns information for a dmadev. Parameters: int dev_id");
+	rte_telemetry_register_cmd("/dmadev/stats",
+			dmadev_handle_dev_stats,
+			"Returns the stats for a dmadev. Parameters: int dev_id, vchan_id");
+}
-- 
2.25.1


^ permalink raw reply	[flat|nested] 15+ messages in thread

* RE: [PATCH v1] dmadev: add telemetry support
  2022-03-23 16:49 [PATCH v1] dmadev: add telemetry support Sean Morrissey
@ 2022-03-25  9:29 ` Pai G, Sunil
  2022-03-29 13:10 ` Bruce Richardson
  2022-03-31 18:39 ` [PATCH v2] " Sean Morrissey
  2 siblings, 0 replies; 15+ messages in thread
From: Pai G, Sunil @ 2022-03-25  9:29 UTC (permalink / raw)
  To: Morrissey, Sean, Chengwen Feng, Laatz, Kevin, Richardson, Bruce
  Cc: dev, Morrissey, Sean


> -----Original Message-----
> From: Sean Morrissey <sean.morrissey@intel.com>
> Sent: Wednesday, March 23, 2022 10:19 PM
> To: Chengwen Feng <fengchengwen@huawei.com>; Laatz, Kevin
> <kevin.laatz@intel.com>; Richardson, Bruce <bruce.richardson@intel.com>
> Cc: dev@dpdk.org; Morrissey, Sean <sean.morrissey@intel.com>
> Subject: [PATCH v1] dmadev: add telemetry support
> 
> Telemetry commands are now registered through the dmadev library for the
> gathering of DSA stats. The corresponding callback functions for listing
> dmadevs and providing info and stats for a specific dmadev are implemented
> in the dmadev library.
> 
> An example usage can be seen below:
> 
> Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
> {"version": "DPDK 22.03.0-rc2", "pid": 2956551, "max_output_len": 16384}
> Connected to application: "dpdk-dma"
> --> /
> {"/": ["/", "/dmadev/info", "/dmadev/list", "/dmadev/stats", ...]}
> --> /dmadev/list
> {"/dmadev/list": [0, 1]}
> --> /dmadev/info,0
> {"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1, "numa_node": 0}}
> --> /dmadev/stats,0,0
> {"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}}
> 
> Signed-off-by: Sean Morrissey <sean.morrissey@intel.com>
> ---
>  doc/guides/prog_guide/dmadev.rst       |  24 ++++++
>  doc/guides/rel_notes/release_22_07.rst |   4 +
>  lib/dmadev/meson.build                 |   2 +
>  lib/dmadev/rte_dmadev.c                | 105 +++++++++++++++++++++++++
>  4 files changed, 135 insertions(+)
> 

Thanks for adding the telemetry support.

Tested-by: Sunil Pai G <sunil.pai.g@intel.com> 

Regards,
Sunil

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v1] dmadev: add telemetry support
  2022-03-23 16:49 [PATCH v1] dmadev: add telemetry support Sean Morrissey
  2022-03-25  9:29 ` Pai G, Sunil
@ 2022-03-29 13:10 ` Bruce Richardson
  2022-03-31 18:39 ` [PATCH v2] " Sean Morrissey
  2 siblings, 0 replies; 15+ messages in thread
From: Bruce Richardson @ 2022-03-29 13:10 UTC (permalink / raw)
  To: Sean Morrissey; +Cc: Chengwen Feng, Kevin Laatz, dev

On Wed, Mar 23, 2022 at 04:49:07PM +0000, Sean Morrissey wrote:
> Telemetry commands are now registered through the dmadev library
> for the gathering of DSA stats. The corresponding callback
> functions for listing dmadevs and providing info and stats for a
> specific dmadev are implemented in the dmadev library.
> 
> An example usage can be seen below:
> 
> Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
> {"version": "DPDK 22.03.0-rc2", "pid": 2956551, "max_output_len": 16384}
> Connected to application: "dpdk-dma"
> --> /
> {"/": ["/", "/dmadev/info", "/dmadev/list", "/dmadev/stats", ...]}
> --> /dmadev/list
> {"/dmadev/list": [0, 1]}
> --> /dmadev/info,0
> {"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1, "numa_node": 0}}
> --> /dmadev/stats,0,0
> {"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}}

I am wondering if for simplicity we should allow the vchan id to be omitted
if only one vchan is present. For automated use by tools it probably won't
matter, but for interactive use it might be nice.

> 
> Signed-off-by: Sean Morrissey <sean.morrissey@intel.com>
> ---
>  doc/guides/prog_guide/dmadev.rst       |  24 ++++++
>  doc/guides/rel_notes/release_22_07.rst |   4 +
>  lib/dmadev/meson.build                 |   2 +
>  lib/dmadev/rte_dmadev.c                | 105 +++++++++++++++++++++++++
>  4 files changed, 135 insertions(+)
> 
> diff --git a/doc/guides/prog_guide/dmadev.rst b/doc/guides/prog_guide/dmadev.rst
> index 77863f8028..1ff66dfe2a 100644
> --- a/doc/guides/prog_guide/dmadev.rst
> +++ b/doc/guides/prog_guide/dmadev.rst
> @@ -118,3 +118,27 @@ i.e. ``rte_dma_stats_get()``. The statistics returned for each device instance a
>  * ``submitted``: The number of operations submitted to the device.
>  * ``completed``: The number of operations which have completed (successful and failed).
>  * ``errors``: The number of operations that completed with error.
> +
> +The dmadev library has support for displaying DMA device information
> +through the Telemetry interface. Telemetry commands that can be used
> +are shown below.
> +
> +#. Get the list of available DMA devices by ID::
> +
> +     --> /dmadev/list
> +     {"/dmadev/list": [0, 1]}
> +
> +#. Get general information from a DMA device::
> +

Explain here that the device id is passed as parameter.

> +     --> /dmadev/info,0
> +     {"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1,
> +     "numa_node": 0}}
> +
> +#. Get the statistics for a particular DMA device and virtual DMA channel::
> +
> +     --> /dmadev/stats,0,0

Again, explain the parameters.

> +     {"/dmadev/stats": {"submitted": 0, "completed": 0,
> +     "errors": 0}}
> +
> +For more information on how to use the Telemetry interface, see
> +the :doc:`../howto/telemetry`.
> diff --git a/doc/guides/rel_notes/release_22_07.rst b/doc/guides/rel_notes/release_22_07.rst
> index 42a5f2d990..5a236b45ae 100644
> --- a/doc/guides/rel_notes/release_22_07.rst
> +++ b/doc/guides/rel_notes/release_22_07.rst
> @@ -55,6 +55,10 @@ New Features
>       Also, make sure to start the actual text at the margin.
>       =======================================================
>  
> +* **Added telemetry callbacks to dmadev library.**
> +
> +  Added telemetry callback functions which allow for a list of DMA devices,
> +  stats for a DMA device, and other DMA device information to be queried.
>  
>  Removed Items
>  -------------
> diff --git a/lib/dmadev/meson.build b/lib/dmadev/meson.build
> index d2fc85e8c7..2f17587b75 100644
> --- a/lib/dmadev/meson.build
> +++ b/lib/dmadev/meson.build
> @@ -5,3 +5,5 @@ sources = files('rte_dmadev.c')
>  headers = files('rte_dmadev.h')
>  indirect_headers += files('rte_dmadev_core.h')
>  driver_sdk_headers += files('rte_dmadev_pmd.h')
> +
> +deps += ['telemetry']

This is actually unnecessary as EAL depends on telemetry so it's an
implicit dependency of every other lib. While functionally it doesn't hurt
to list it, I'd tend towards not doing so, as in the past I've seen meson
configuration runs slow down if we have unnecessary dependencies called out
that then need to be deduplicated in python.

> diff --git a/lib/dmadev/rte_dmadev.c b/lib/dmadev/rte_dmadev.c
> index d4b32b2971..2f068cb9d8 100644
> --- a/lib/dmadev/rte_dmadev.c
> +++ b/lib/dmadev/rte_dmadev.c
> @@ -11,6 +11,7 @@
>  #include <rte_malloc.h>
>  #include <rte_memzone.h>
>  #include <rte_string_fns.h>
> +#include <rte_telemetry.h>
>  
>  #include "rte_dmadev.h"
>  #include "rte_dmadev_pmd.h"
> @@ -864,3 +865,107 @@ dma_fp_object_dummy(struct rte_dma_fp_object *obj)
>  	obj->completed_status = dummy_completed_status;
>  	obj->burst_capacity   = dummy_burst_capacity;
>  }
> +
> +static int
> +dmadev_handle_dev_list(const char *cmd __rte_unused,
> +		const char *params __rte_unused,
> +		struct rte_tel_data *d)
> +{
> +	int dev_id;
> +
> +	if (rte_dma_count_avail() == 0)
> +		return -EINVAL;
> +
Rather than error, we should just return an empty list. Just removing this
check should do the trick.

> +	rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
> +	for (dev_id = 0; dev_id < dma_devices_max; dev_id++)
> +		if (rte_dma_is_valid(dev_id))
> +			rte_tel_data_add_array_int(d, dev_id);
> +
> +	return 0;
> +}
> +
> +static int
> +dmadev_handle_dev_info(const char *cmd __rte_unused,
> +		const char *params, struct rte_tel_data *d)
> +{
> +	struct rte_dma_info dma_info;
> +	int dev_id, ret;
> +	char *end_param;
> +
> +	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
> +		return -EINVAL;
> +
> +	dev_id = strtoul(params, &end_param, 0);
> +	if (*end_param != '\0')
> +		RTE_DMA_LOG(ERR,
> +		    "Extra parameters passed to dmadev telemetry command, ignoring");
> +
> +	if (!rte_dma_is_valid(dev_id))
> +		return -EINVAL;
> +
> +	ret = rte_dma_info_get(dev_id, &dma_info);
> +	if (ret < 0)
> +		return -EINVAL;
> +
> +	rte_tel_data_start_dict(d);
> +	rte_tel_data_add_dict_string(d, "name",
> +			dma_info.dev_name);
> +	rte_tel_data_add_dict_int(d, "nb_vchans",
> +			dma_info.nb_vchans);
> +	rte_tel_data_add_dict_int(d, "numa_node",
> +			dma_info.numa_node);
> +
> +	return 0;
> +}

There is more information returned by info_get function than called out
here, so I think the function should be expanded. For the capabilities, for
example, I think each one should be called out by name with a 0 or 1 value,
so things are nice and clear.

> +
> +#define ADD_DICT_STAT(s) rte_tel_data_add_dict_u64(d, #s, dma_stats.s)
> +
> +static int
> +dmadev_handle_dev_stats(const char *cmd __rte_unused,
> +		const char *params,
> +		struct rte_tel_data *d)
> +{
> +	struct rte_dma_stats dma_stats;
> +	int dev_id, vchan_id, ret;
> +	char *end_param;
> +	const char *vchan_param;
> +
> +	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
> +		return -EINVAL;
> +
> +	dev_id = strtoul(params, &end_param, 0);
> +	vchan_param = strtok(end_param, ",");
> +	if (!vchan_param || strlen(vchan_param) == 0 || !isdigit(*vchan_param))
> +		return -EINVAL;
> +
> +	vchan_id = strtoul(vchan_param, &end_param, 0);
> +	if (*end_param != '\0')
> +		RTE_DMA_LOG(ERR,
> +		    "Extra parameters passed to dmadev telemetry command, ignoring");

You don't need to split these lines like this. Lines up to 100 chars are
allowed, and any strings are allowed to continue on past that, so it's only
after a long string you need to split the line. Also, according to our
coding guidelines, line continuations should be double-indented or
alternatively aligned to the opening brace on the previous line. Check what
is done already the file and keep it consistent with that.

> +
> +	if (!rte_dma_is_valid(dev_id))
> +		return -EINVAL;
> +
> +	ret = rte_dma_stats_get(dev_id, vchan_id, &dma_stats);
> +	if (ret < 0)
> +		return -EINVAL;
> +
> +	rte_tel_data_start_dict(d);
> +	ADD_DICT_STAT(submitted);
> +	ADD_DICT_STAT(completed);
> +	ADD_DICT_STAT(errors);
> +
> +	return 0;
> +}
> +
> +RTE_INIT(dmadev_init_telemetry)
> +{
> +	rte_telemetry_register_cmd("/dmadev/list",
> +			dmadev_handle_dev_list,
> +			"Returns list of available dmadev devices by IDs. No parameters.");

This can be shrunk to 2 lines I think.

> +	rte_telemetry_register_cmd("/dmadev/info", dmadev_handle_dev_info,
> +			"Returns information for a dmadev. Parameters: int dev_id");
> +	rte_telemetry_register_cmd("/dmadev/stats",
> +			dmadev_handle_dev_stats,
> +			"Returns the stats for a dmadev. Parameters: int dev_id, vchan_id");
> +}
> -- 
> 2.25.1
> 

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2] dmadev: add telemetry support
  2022-03-23 16:49 [PATCH v1] dmadev: add telemetry support Sean Morrissey
  2022-03-25  9:29 ` Pai G, Sunil
  2022-03-29 13:10 ` Bruce Richardson
@ 2022-03-31 18:39 ` Sean Morrissey
  2022-04-01  8:39   ` Bruce Richardson
  2022-04-01 10:24   ` [PATCH v3] " Sean Morrissey
  2 siblings, 2 replies; 15+ messages in thread
From: Sean Morrissey @ 2022-03-31 18:39 UTC (permalink / raw)
  To: Chengwen Feng, Kevin Laatz, Bruce Richardson
  Cc: dev, Sean Morrissey, Sunil Pai G

Telemetry commands are now registered through the dmadev library
for the gathering of DSA stats. The corresponding callback
functions for listing dmadevs and providing info and stats for a
specific dmadev are implemented in the dmadev library.

An example usage can be seen below:

Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
{"version": "DPDK 22.03.0-rc2", "pid": 2956551, "max_output_len": 16384}
Connected to application: "dpdk-dma"
--> /
{"/": ["/", "/dmadev/info", "/dmadev/list", "/dmadev/stats", ...]}
--> /dmadev/list
{"/dmadev/list": [0, 1]}
--> /dmadev/info,0
{"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1, "numa_node": 0}}
--> /dmadev/stats,0,0
{"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}}

Signed-off-by: Sean Morrissey <sean.morrissey@intel.com>
Tested-by: Sunil Pai G <sunil.pai.g@intel.com>
---
V2:
* add device capabilities to info command
* no requirement to pass vchan id
  if the device only has one vchan
* minor code cleanup
---
 doc/guides/prog_guide/dmadev.rst       |  27 ++++++
 doc/guides/rel_notes/release_22_07.rst |   4 +
 lib/dmadev/meson.build                 |   2 +
 lib/dmadev/rte_dmadev.c                | 127 +++++++++++++++++++++++++
 4 files changed, 160 insertions(+)

diff --git a/doc/guides/prog_guide/dmadev.rst b/doc/guides/prog_guide/dmadev.rst
index 77863f8028..a2e4617091 100644
--- a/doc/guides/prog_guide/dmadev.rst
+++ b/doc/guides/prog_guide/dmadev.rst
@@ -118,3 +118,30 @@ i.e. ``rte_dma_stats_get()``. The statistics returned for each device instance a
 * ``submitted``: The number of operations submitted to the device.
 * ``completed``: The number of operations which have completed (successful and failed).
 * ``errors``: The number of operations that completed with error.
+
+The dmadev library has support for displaying DMA device information
+through the Telemetry interface. Telemetry commands that can be used
+are shown below.
+
+#. Get the list of available DMA devices by ID::
+
+     --> /dmadev/list
+     {"/dmadev/list": [0, 1]}
+
+#. Get general information from a DMA device by passing the device id as a parameter::
+
+     --> /dmadev/info,0
+     {"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1, "numa_node": 0}}
+
+#. Get the statistics for a particular DMA device and virtual DMA channel by passing the device id and vchan id as parameters::
+
+     --> /dmadev/stats,0,0
+     {"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}}
+
+#. If a DMA device only has one virtual DMA channel you only need to pass the device id to get its statistics::
+
+     --> /dmadev/stats,0
+     {"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}}
+
+For more information on how to use the Telemetry interface, see
+the :doc:`../howto/telemetry`.
diff --git a/doc/guides/rel_notes/release_22_07.rst b/doc/guides/rel_notes/release_22_07.rst
index 42a5f2d990..5a236b45ae 100644
--- a/doc/guides/rel_notes/release_22_07.rst
+++ b/doc/guides/rel_notes/release_22_07.rst
@@ -55,6 +55,10 @@ New Features
      Also, make sure to start the actual text at the margin.
      =======================================================
 
+* **Added telemetry callbacks to dmadev library.**
+
+  Added telemetry callback functions which allow for a list of DMA devices,
+  stats for a DMA device, and other DMA device information to be queried.
 
 Removed Items
 -------------
diff --git a/lib/dmadev/meson.build b/lib/dmadev/meson.build
index d2fc85e8c7..2f17587b75 100644
--- a/lib/dmadev/meson.build
+++ b/lib/dmadev/meson.build
@@ -5,3 +5,5 @@ sources = files('rte_dmadev.c')
 headers = files('rte_dmadev.h')
 indirect_headers += files('rte_dmadev_core.h')
 driver_sdk_headers += files('rte_dmadev_pmd.h')
+
+deps += ['telemetry']
diff --git a/lib/dmadev/rte_dmadev.c b/lib/dmadev/rte_dmadev.c
index d4b32b2971..6cd6a8db46 100644
--- a/lib/dmadev/rte_dmadev.c
+++ b/lib/dmadev/rte_dmadev.c
@@ -11,6 +11,7 @@
 #include <rte_malloc.h>
 #include <rte_memzone.h>
 #include <rte_string_fns.h>
+#include <rte_telemetry.h>
 
 #include "rte_dmadev.h"
 #include "rte_dmadev_pmd.h"
@@ -864,3 +865,129 @@ dma_fp_object_dummy(struct rte_dma_fp_object *obj)
 	obj->completed_status = dummy_completed_status;
 	obj->burst_capacity   = dummy_burst_capacity;
 }
+
+static int
+dmadev_handle_dev_list(const char *cmd __rte_unused,
+		const char *params __rte_unused,
+		struct rte_tel_data *d)
+{
+	int dev_id;
+
+	rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
+	for (dev_id = 0; dev_id < dma_devices_max; dev_id++)
+		if (rte_dma_is_valid(dev_id))
+			rte_tel_data_add_array_int(d, dev_id);
+
+	return 0;
+}
+
+static int
+dmadev_handle_dev_info(const char *cmd __rte_unused,
+		const char *params, struct rte_tel_data *d)
+{
+	struct rte_dma_info dma_info;
+	struct rte_tel_data *dma_caps;
+	int dev_id, ret;
+	char *end_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -EINVAL;
+
+	dev_id = strtoul(params, &end_param, 0);
+	if (*end_param != '\0')
+		RTE_DMA_LOG(WARNING, "Extra parameters passed to dmadev telemetry command, ignoring");
+
+	ret = rte_dma_info_get(dev_id, &dma_info);
+	if (ret < 0)
+		return -EINVAL;
+
+	rte_tel_data_start_dict(d);
+	rte_tel_data_add_dict_string(d, "name", dma_info.dev_name);
+	rte_tel_data_add_dict_int(d, "nb_vchans", dma_info.nb_vchans);
+	rte_tel_data_add_dict_int(d, "numa_node", dma_info.numa_node);
+	rte_tel_data_add_dict_int(d, "max_vchans", dma_info.max_vchans);
+	rte_tel_data_add_dict_int(d, "max_desc", dma_info.max_desc);
+	rte_tel_data_add_dict_int(d, "min_desc", dma_info.min_desc);
+	rte_tel_data_add_dict_int(d, "max_sges", dma_info.max_sges);
+
+	dma_caps = rte_tel_data_alloc();
+	if (!dma_caps)
+		return -ENOMEM;
+
+	rte_tel_data_start_dict(dma_caps);
+	rte_tel_data_add_dict_int(dma_caps, "fill", !!(dma_info.dev_capa & RTE_DMA_CAPA_OPS_FILL));
+	rte_tel_data_add_dict_int(dma_caps, "sva", !!(dma_info.dev_capa & RTE_DMA_CAPA_SVA));
+	rte_tel_data_add_dict_int(dma_caps, "silent", !!(dma_info.dev_capa & RTE_DMA_CAPA_SILENT));
+	rte_tel_data_add_dict_int(dma_caps, "copy", !!(dma_info.dev_capa & RTE_DMA_CAPA_OPS_COPY));
+	rte_tel_data_add_dict_int(dma_caps, "mem2mem",
+					!!(dma_info.dev_capa & RTE_DMA_CAPA_MEM_TO_MEM));
+	rte_tel_data_add_dict_int(dma_caps, "mem2dev",
+					!!(dma_info.dev_capa & RTE_DMA_CAPA_MEM_TO_DEV));
+	rte_tel_data_add_dict_int(dma_caps, "dev2mem",
+					!!(dma_info.dev_capa & RTE_DMA_CAPA_DEV_TO_MEM));
+	rte_tel_data_add_dict_int(dma_caps, "dev2dev",
+					!!(dma_info.dev_capa & RTE_DMA_CAPA_DEV_TO_DEV));
+	rte_tel_data_add_dict_int(dma_caps, "copy_sg",
+					!!(dma_info.dev_capa & RTE_DMA_CAPA_OPS_COPY_SG));
+	rte_tel_data_add_dict_int(dma_caps, "handles_errors",
+					!!(dma_info.dev_capa & RTE_DMA_CAPA_HANDLES_ERRORS));
+	rte_tel_data_add_dict_container(d, "capabilities", dma_caps, 0);
+
+	return 0;
+}
+
+#define ADD_DICT_STAT(s) rte_tel_data_add_dict_u64(d, #s, dma_stats.s)
+
+static int
+dmadev_handle_dev_stats(const char *cmd __rte_unused,
+		const char *params,
+		struct rte_tel_data *d)
+{
+	struct rte_dma_info dma_info;
+	struct rte_dma_stats dma_stats;
+	int dev_id, vchan_id, ret;
+	char *end_param;
+	const char *vchan_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -EINVAL;
+
+	dev_id = strtoul(params, &end_param, 0);
+
+	ret = rte_dma_info_get(dev_id, &dma_info);
+	if (ret < 0)
+		return -EINVAL;
+
+	if (dma_info.nb_vchans == 1 && *end_param == '\0') {
+		vchan_id = 0;
+	} else {
+		vchan_param = strtok(end_param, ",");
+		if (!vchan_param || strlen(vchan_param) == 0 || !isdigit(*vchan_param))
+			return -EINVAL;
+
+		vchan_id = strtoul(vchan_param, &end_param, 0);
+	}
+	if (*end_param != '\0')
+		RTE_DMA_LOG(WARNING, "Extra parameters passed to dmadev telemetry command, ignoring");
+
+	ret = rte_dma_stats_get(dev_id, vchan_id, &dma_stats);
+	if (ret < 0)
+		return -EINVAL;
+
+	rte_tel_data_start_dict(d);
+	ADD_DICT_STAT(submitted);
+	ADD_DICT_STAT(completed);
+	ADD_DICT_STAT(errors);
+
+	return 0;
+}
+
+RTE_INIT(dmadev_init_telemetry)
+{
+	rte_telemetry_register_cmd("/dmadev/list", dmadev_handle_dev_list,
+			"Returns list of available dmadev devices by IDs. No parameters.");
+	rte_telemetry_register_cmd("/dmadev/info", dmadev_handle_dev_info,
+			"Returns information for a dmadev. Parameters: int dev_id");
+	rte_telemetry_register_cmd("/dmadev/stats", dmadev_handle_dev_stats,
+			"Returns the stats for a dmadev vchannel. Parameters: int dev_id, vchan_id (If only one vchannel, vchan_id param is optional)");
+}
-- 
2.25.1


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2] dmadev: add telemetry support
  2022-03-31 18:39 ` [PATCH v2] " Sean Morrissey
@ 2022-04-01  8:39   ` Bruce Richardson
  2022-04-01 10:24   ` [PATCH v3] " Sean Morrissey
  1 sibling, 0 replies; 15+ messages in thread
From: Bruce Richardson @ 2022-04-01  8:39 UTC (permalink / raw)
  To: Sean Morrissey; +Cc: Chengwen Feng, Kevin Laatz, dev, Sunil Pai G

On Thu, Mar 31, 2022 at 06:39:46PM +0000, Sean Morrissey wrote:
> Telemetry commands are now registered through the dmadev library
> for the gathering of DSA stats. The corresponding callback
> functions for listing dmadevs and providing info and stats for a
> specific dmadev are implemented in the dmadev library.
> 
> An example usage can be seen below:
> 
> Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
> {"version": "DPDK 22.03.0-rc2", "pid": 2956551, "max_output_len": 16384}
> Connected to application: "dpdk-dma"
> --> /
> {"/": ["/", "/dmadev/info", "/dmadev/list", "/dmadev/stats", ...]}
> --> /dmadev/list
> {"/dmadev/list": [0, 1]}
> --> /dmadev/info,0
> {"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1, "numa_node": 0}}

This needs an update now that more info is being output. It probably all
does not need to be displayed here, so adding "..." may be enough if you
like.

> --> /dmadev/stats,0,0
> {"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}}
> 
> Signed-off-by: Sean Morrissey <sean.morrissey@intel.com>
> Tested-by: Sunil Pai G <sunil.pai.g@intel.com>
> ---
> V2:
> * add device capabilities to info command
> * no requirement to pass vchan id
>   if the device only has one vchan
> * minor code cleanup
> ---
>  doc/guides/prog_guide/dmadev.rst       |  27 ++++++
>  doc/guides/rel_notes/release_22_07.rst |   4 +
>  lib/dmadev/meson.build                 |   2 +
>  lib/dmadev/rte_dmadev.c                | 127 +++++++++++++++++++++++++
>  4 files changed, 160 insertions(+)
> 
> diff --git a/doc/guides/prog_guide/dmadev.rst b/doc/guides/prog_guide/dmadev.rst
> index 77863f8028..a2e4617091 100644
> --- a/doc/guides/prog_guide/dmadev.rst
> +++ b/doc/guides/prog_guide/dmadev.rst
> @@ -118,3 +118,30 @@ i.e. ``rte_dma_stats_get()``. The statistics returned for each device instance a
>  * ``submitted``: The number of operations submitted to the device.
>  * ``completed``: The number of operations which have completed (successful and failed).
>  * ``errors``: The number of operations that completed with error.
> +
> +The dmadev library has support for displaying DMA device information
> +through the Telemetry interface. Telemetry commands that can be used
> +are shown below.
> +
> +#. Get the list of available DMA devices by ID::
> +
> +     --> /dmadev/list
> +     {"/dmadev/list": [0, 1]}
> +
> +#. Get general information from a DMA device by passing the device id as a parameter::
> +
> +     --> /dmadev/info,0
> +     {"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1, "numa_node": 0}}
> +
As above

> +#. Get the statistics for a particular DMA device and virtual DMA channel by passing the device id and vchan id as parameters::
> +
> +     --> /dmadev/stats,0,0
> +     {"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}}
> +
> +#. If a DMA device only has one virtual DMA channel you only need to pass the device id to get its statistics::
> +
> +     --> /dmadev/stats,0
> +     {"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}}
> +

Since this is only a convenience, I think you can omit the example for it,
and just include the info about it in brackets at the end of the bullet
point above - it doesn't need its own bullet.

> +For more information on how to use the Telemetry interface, see
> +the :doc:`../howto/telemetry`.
> diff --git a/doc/guides/rel_notes/release_22_07.rst b/doc/guides/rel_notes/release_22_07.rst
> index 42a5f2d990..5a236b45ae 100644
> --- a/doc/guides/rel_notes/release_22_07.rst
> +++ b/doc/guides/rel_notes/release_22_07.rst
> @@ -55,6 +55,10 @@ New Features
>       Also, make sure to start the actual text at the margin.
>       =======================================================
>  
> +* **Added telemetry callbacks to dmadev library.**
> +
> +  Added telemetry callback functions which allow for a list of DMA devices,
> +  stats for a DMA device, and other DMA device information to be queried.
>  

For correct formatting of the doc, I think you need to add a new blank line
here, since sections end with two empty lines.

>  Removed Items
>  -------------
> diff --git a/lib/dmadev/meson.build b/lib/dmadev/meson.build
> index d2fc85e8c7..2f17587b75 100644
> --- a/lib/dmadev/meson.build
> +++ b/lib/dmadev/meson.build
> @@ -5,3 +5,5 @@ sources = files('rte_dmadev.c')
>  headers = files('rte_dmadev.h')
>  indirect_headers += files('rte_dmadev_core.h')
>  driver_sdk_headers += files('rte_dmadev_pmd.h')
> +
> +deps += ['telemetry']
> diff --git a/lib/dmadev/rte_dmadev.c b/lib/dmadev/rte_dmadev.c
> index d4b32b2971..6cd6a8db46 100644
> --- a/lib/dmadev/rte_dmadev.c
> +++ b/lib/dmadev/rte_dmadev.c
> @@ -11,6 +11,7 @@
>  #include <rte_malloc.h>
>  #include <rte_memzone.h>
>  #include <rte_string_fns.h>
> +#include <rte_telemetry.h>
>  
>  #include "rte_dmadev.h"
>  #include "rte_dmadev_pmd.h"
> @@ -864,3 +865,129 @@ dma_fp_object_dummy(struct rte_dma_fp_object *obj)
>  	obj->completed_status = dummy_completed_status;
>  	obj->burst_capacity   = dummy_burst_capacity;
>  }
> +
> +static int
> +dmadev_handle_dev_list(const char *cmd __rte_unused,
> +		const char *params __rte_unused,
> +		struct rte_tel_data *d)
> +{
> +	int dev_id;
> +
> +	rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
> +	for (dev_id = 0; dev_id < dma_devices_max; dev_id++)
> +		if (rte_dma_is_valid(dev_id))
> +			rte_tel_data_add_array_int(d, dev_id);
> +
> +	return 0;
> +}
> +
> +static int
> +dmadev_handle_dev_info(const char *cmd __rte_unused,
> +		const char *params, struct rte_tel_data *d)
> +{
> +	struct rte_dma_info dma_info;
> +	struct rte_tel_data *dma_caps;
> +	int dev_id, ret;
> +	char *end_param;
> +
> +	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
> +		return -EINVAL;
> +
> +	dev_id = strtoul(params, &end_param, 0);
> +	if (*end_param != '\0')
> +		RTE_DMA_LOG(WARNING, "Extra parameters passed to dmadev telemetry command, ignoring");
> +
> +	ret = rte_dma_info_get(dev_id, &dma_info);

For clarity, I think it might be worthwhile adding a one-line comment here
that info_get does parameter checking of dev_id so we don't need to do so.
Same comment would also apply to stats function below.

> +	if (ret < 0)
> +		return -EINVAL;
> +
> +	rte_tel_data_start_dict(d);
> +	rte_tel_data_add_dict_string(d, "name", dma_info.dev_name);
> +	rte_tel_data_add_dict_int(d, "nb_vchans", dma_info.nb_vchans);
> +	rte_tel_data_add_dict_int(d, "numa_node", dma_info.numa_node);
> +	rte_tel_data_add_dict_int(d, "max_vchans", dma_info.max_vchans);
> +	rte_tel_data_add_dict_int(d, "max_desc", dma_info.max_desc);
> +	rte_tel_data_add_dict_int(d, "min_desc", dma_info.min_desc);
> +	rte_tel_data_add_dict_int(d, "max_sges", dma_info.max_sges);
> +
> +	dma_caps = rte_tel_data_alloc();
> +	if (!dma_caps)
> +		return -ENOMEM;
> +
> +	rte_tel_data_start_dict(dma_caps);
> +	rte_tel_data_add_dict_int(dma_caps, "fill", !!(dma_info.dev_capa & RTE_DMA_CAPA_OPS_FILL));
> +	rte_tel_data_add_dict_int(dma_caps, "sva", !!(dma_info.dev_capa & RTE_DMA_CAPA_SVA));
> +	rte_tel_data_add_dict_int(dma_caps, "silent", !!(dma_info.dev_capa & RTE_DMA_CAPA_SILENT));
> +	rte_tel_data_add_dict_int(dma_caps, "copy", !!(dma_info.dev_capa & RTE_DMA_CAPA_OPS_COPY));
> +	rte_tel_data_add_dict_int(dma_caps, "mem2mem",
> +					!!(dma_info.dev_capa & RTE_DMA_CAPA_MEM_TO_MEM));

Two ideas here in case you wan to consider them for shortening these lines:
* assign "dma_info.dev_capa" to a local var with a short name
* define a macro for adding the capabilities based on the name, something
  like (completely untested!):

#define ADD_CAPA (td, c, name) \
	rte_tel_data_add_dict_int(td, #name, !!(RTE_DMA_CAPA_ ## name & c))

...
ADD_CAPA(dma_caps, dev_capa, MEM_TO_MEM);
ADD_CAPA(dma_caps, dev_capa, MEM_TO_DEV);

The small downside of the macro scheme is that you'd have to do extra work
to avoid having the capabilities in caps, but it does guarantee consistency
of naming.

> +	rte_tel_data_add_dict_int(dma_caps, "mem2dev",
> +					!!(dma_info.dev_capa & RTE_DMA_CAPA_MEM_TO_DEV));
> +	rte_tel_data_add_dict_int(dma_caps, "dev2mem",
> +					!!(dma_info.dev_capa & RTE_DMA_CAPA_DEV_TO_MEM));
> +	rte_tel_data_add_dict_int(dma_caps, "dev2dev",
> +					!!(dma_info.dev_capa & RTE_DMA_CAPA_DEV_TO_DEV));
> +	rte_tel_data_add_dict_int(dma_caps, "copy_sg",
> +					!!(dma_info.dev_capa & RTE_DMA_CAPA_OPS_COPY_SG));
> +	rte_tel_data_add_dict_int(dma_caps, "handles_errors",
> +					!!(dma_info.dev_capa & RTE_DMA_CAPA_HANDLES_ERRORS));
> +	rte_tel_data_add_dict_container(d, "capabilities", dma_caps, 0);
> +
> +	return 0;
> +}
> +
> +#define ADD_DICT_STAT(s) rte_tel_data_add_dict_u64(d, #s, dma_stats.s)
> +
> +static int
> +dmadev_handle_dev_stats(const char *cmd __rte_unused,
> +		const char *params,
> +		struct rte_tel_data *d)
> +{
> +	struct rte_dma_info dma_info;
> +	struct rte_dma_stats dma_stats;
> +	int dev_id, vchan_id, ret;
> +	char *end_param;
> +	const char *vchan_param;
> +
> +	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
> +		return -EINVAL;
> +
> +	dev_id = strtoul(params, &end_param, 0);
> +
> +	ret = rte_dma_info_get(dev_id, &dma_info);
> +	if (ret < 0)
> +		return -EINVAL;
> +
> +	if (dma_info.nb_vchans == 1 && *end_param == '\0') {

Needs a comment explaining what is happening.
Also for single-line blocks in DPDK, we allow omitting the braces (even if
the else leg needs them).

If you want to remove this block, you can also just set vchan_id = 0 when
defining it, and then change the else to be and if with the inverse of the
condition above

> +		vchan_id = 0;
> +	} else {
> +		vchan_param = strtok(end_param, ",");
> +		if (!vchan_param || strlen(vchan_param) == 0 || !isdigit(*vchan_param))
> +			return -EINVAL;
> +
> +		vchan_id = strtoul(vchan_param, &end_param, 0);
> +	}
> +	if (*end_param != '\0')
> +		RTE_DMA_LOG(WARNING, "Extra parameters passed to dmadev telemetry command, ignoring");
> +
> +	ret = rte_dma_stats_get(dev_id, vchan_id, &dma_stats);
> +	if (ret < 0)
> +		return -EINVAL;
> +
> +	rte_tel_data_start_dict(d);
> +	ADD_DICT_STAT(submitted);
> +	ADD_DICT_STAT(completed);
> +	ADD_DICT_STAT(errors);
> +
> +	return 0;
> +}
> +
> +RTE_INIT(dmadev_init_telemetry)
> +{
> +	rte_telemetry_register_cmd("/dmadev/list", dmadev_handle_dev_list,
> +			"Returns list of available dmadev devices by IDs. No parameters.");
> +	rte_telemetry_register_cmd("/dmadev/info", dmadev_handle_dev_info,
> +			"Returns information for a dmadev. Parameters: int dev_id");
> +	rte_telemetry_register_cmd("/dmadev/stats", dmadev_handle_dev_stats,
> +			"Returns the stats for a dmadev vchannel. Parameters: int dev_id, vchan_id (If only one vchannel, vchan_id param is optional)");

Can shorten text in brackets to "(Optional if only one vchannel)", since it
immediately follows the parameter.

Regards,
/Bruce

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v3] dmadev: add telemetry support
  2022-03-31 18:39 ` [PATCH v2] " Sean Morrissey
  2022-04-01  8:39   ` Bruce Richardson
@ 2022-04-01 10:24   ` Sean Morrissey
  2022-04-01 10:50     ` Bruce Richardson
  2022-04-01 14:53     ` [PATCH v4] " Sean Morrissey
  1 sibling, 2 replies; 15+ messages in thread
From: Sean Morrissey @ 2022-04-01 10:24 UTC (permalink / raw)
  To: Chengwen Feng, Kevin Laatz, Bruce Richardson
  Cc: dev, Sean Morrissey, Sunil Pai G

Telemetry commands are now registered through the dmadev library
for the gathering of DSA stats. The corresponding callback
functions for listing dmadevs and providing info and stats for a
specific dmadev are implemented in the dmadev library.

An example usage can be seen below:

Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
{"version": "DPDK 22.03.0-rc2", "pid": 2956551, "max_output_len": 16384}
Connected to application: "dpdk-dma"
--> /
{"/": ["/", "/dmadev/info", "/dmadev/list", "/dmadev/stats", ...]}
--> /dmadev/list
{"/dmadev/list": [0, 1]}
--> /dmadev/info,0
{"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1, "numa_node": 0,
"max_vchans": 1, "max_desc": 4096, "min_desc": 32, "max_sges": 0,
"capabilities": {"fill": 1, "sva": 0, "silent": 0, ...}}}
--> /dmadev/stats,0,0
{"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}}

Signed-off-by: Sean Morrissey <sean.morrissey@intel.com>
Tested-by: Sunil Pai G <sunil.pai.g@intel.com>
---
V3:
* update docs with correct examples
* code cleanup and added comments
V2:
* add device capabilities to info command
* no requirement to pass vchan id
  if the device only has one vchan
* minor code cleanup
---
 doc/guides/prog_guide/dmadev.rst       |  24 +++++
 doc/guides/rel_notes/release_22_07.rst |   5 +
 lib/dmadev/meson.build                 |   2 +
 lib/dmadev/rte_dmadev.c                | 130 +++++++++++++++++++++++++
 4 files changed, 161 insertions(+)

diff --git a/doc/guides/prog_guide/dmadev.rst b/doc/guides/prog_guide/dmadev.rst
index 77863f8028..ebcd12559e 100644
--- a/doc/guides/prog_guide/dmadev.rst
+++ b/doc/guides/prog_guide/dmadev.rst
@@ -118,3 +118,27 @@ i.e. ``rte_dma_stats_get()``. The statistics returned for each device instance a
 * ``submitted``: The number of operations submitted to the device.
 * ``completed``: The number of operations which have completed (successful and failed).
 * ``errors``: The number of operations that completed with error.
+
+The dmadev library has support for displaying DMA device information
+through the Telemetry interface. Telemetry commands that can be used
+are shown below.
+
+#. Get the list of available DMA devices by ID::
+
+     --> /dmadev/list
+     {"/dmadev/list": [0, 1]}
+
+#. Get general information from a DMA device by passing the device id as a parameter::
+
+     --> /dmadev/info,0
+     {"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1, "numa_node": 0, "max_vchans": 1, "max_desc": 4096,
+     "min_desc": 32, "max_sges": 0, "capabilities": {"fill": 1, "sva": 0, "silent": 0, ...}}}
+
+#. Get the statistics for a particular DMA device and virtual DMA channel by passing the device id and vchan id as parameters
+   (if a DMA device only has one virtual DMA channel you only need to pass the device id)::
+
+     --> /dmadev/stats,0,0
+     {"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}}
+
+For more information on how to use the Telemetry interface, see
+the :doc:`../howto/telemetry`.
diff --git a/doc/guides/rel_notes/release_22_07.rst b/doc/guides/rel_notes/release_22_07.rst
index 42a5f2d990..d6c434ae7b 100644
--- a/doc/guides/rel_notes/release_22_07.rst
+++ b/doc/guides/rel_notes/release_22_07.rst
@@ -55,6 +55,11 @@ New Features
      Also, make sure to start the actual text at the margin.
      =======================================================
 
+* **Added telemetry callbacks to dmadev library.**
+
+  Added telemetry callback functions which allow for a list of DMA devices,
+  stats for a DMA device, and other DMA device information to be queried.
+
 
 Removed Items
 -------------
diff --git a/lib/dmadev/meson.build b/lib/dmadev/meson.build
index d2fc85e8c7..2f17587b75 100644
--- a/lib/dmadev/meson.build
+++ b/lib/dmadev/meson.build
@@ -5,3 +5,5 @@ sources = files('rte_dmadev.c')
 headers = files('rte_dmadev.h')
 indirect_headers += files('rte_dmadev_core.h')
 driver_sdk_headers += files('rte_dmadev_pmd.h')
+
+deps += ['telemetry']
diff --git a/lib/dmadev/rte_dmadev.c b/lib/dmadev/rte_dmadev.c
index d4b32b2971..696e0061dc 100644
--- a/lib/dmadev/rte_dmadev.c
+++ b/lib/dmadev/rte_dmadev.c
@@ -11,6 +11,7 @@
 #include <rte_malloc.h>
 #include <rte_memzone.h>
 #include <rte_string_fns.h>
+#include <rte_telemetry.h>
 
 #include "rte_dmadev.h"
 #include "rte_dmadev_pmd.h"
@@ -864,3 +865,132 @@ dma_fp_object_dummy(struct rte_dma_fp_object *obj)
 	obj->completed_status = dummy_completed_status;
 	obj->burst_capacity   = dummy_burst_capacity;
 }
+
+static int
+dmadev_handle_dev_list(const char *cmd __rte_unused,
+		const char *params __rte_unused,
+		struct rte_tel_data *d)
+{
+	int dev_id;
+
+	rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
+	for (dev_id = 0; dev_id < dma_devices_max; dev_id++)
+		if (rte_dma_is_valid(dev_id))
+			rte_tel_data_add_array_int(d, dev_id);
+
+	return 0;
+}
+
+#define ADD_CAPA(c, s) rte_tel_data_add_dict_int(dma_caps, #c, !!(dev_capa & RTE_DMA_CAPA_ ## s))
+
+static int
+dmadev_handle_dev_info(const char *cmd __rte_unused,
+		const char *params, struct rte_tel_data *d)
+{
+	struct rte_dma_info dma_info;
+	struct rte_tel_data *dma_caps;
+	int dev_id, ret;
+	uint64_t dev_capa;
+	char *end_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -EINVAL;
+
+	dev_id = strtoul(params, &end_param, 0);
+	if (*end_param != '\0')
+		RTE_DMA_LOG(WARNING, "Extra parameters passed to dmadev telemetry command, ignoring");
+
+	/* Function info_get validates dev_id so we dont need to. */
+	ret = rte_dma_info_get(dev_id, &dma_info);
+	if (ret < 0)
+		return -EINVAL;
+	dev_capa = dma_info.dev_capa;
+
+	rte_tel_data_start_dict(d);
+	rte_tel_data_add_dict_string(d, "name", dma_info.dev_name);
+	rte_tel_data_add_dict_int(d, "nb_vchans", dma_info.nb_vchans);
+	rte_tel_data_add_dict_int(d, "numa_node", dma_info.numa_node);
+	rte_tel_data_add_dict_int(d, "max_vchans", dma_info.max_vchans);
+	rte_tel_data_add_dict_int(d, "max_desc", dma_info.max_desc);
+	rte_tel_data_add_dict_int(d, "min_desc", dma_info.min_desc);
+	rte_tel_data_add_dict_int(d, "max_sges", dma_info.max_sges);
+
+	dma_caps = rte_tel_data_alloc();
+	if (!dma_caps)
+		return -ENOMEM;
+
+	rte_tel_data_start_dict(dma_caps);
+	ADD_CAPA(fill, OPS_FILL);
+	ADD_CAPA(sva, SVA);
+	ADD_CAPA(silent, SILENT);
+	ADD_CAPA(copy, OPS_COPY);
+	ADD_CAPA(mem2mem, MEM_TO_MEM);
+	ADD_CAPA(mem2dev, MEM_TO_DEV);
+	ADD_CAPA(dev2mem, DEV_TO_MEM);
+	ADD_CAPA(dev2dev, DEV_TO_DEV);
+	ADD_CAPA(copy_sg, OPS_COPY_SG);
+	ADD_CAPA(handles_errors, HANDLES_ERRORS);
+	rte_tel_data_add_dict_container(d, "capabilities", dma_caps, 0);
+
+	return 0;
+}
+
+#define ADD_DICT_STAT(s) rte_tel_data_add_dict_u64(d, #s, dma_stats.s)
+
+static int
+dmadev_handle_dev_stats(const char *cmd __rte_unused,
+		const char *params,
+		struct rte_tel_data *d)
+{
+	struct rte_dma_info dma_info;
+	struct rte_dma_stats dma_stats;
+	int dev_id, ret, vchan_id;
+	char *end_param;
+	const char *vchan_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -EINVAL;
+
+	dev_id = strtoul(params, &end_param, 0);
+
+	/* Function info_get validates dev_id so we dont need to. */
+	ret = rte_dma_info_get(dev_id, &dma_info);
+	if (ret < 0)
+		return -EINVAL;
+
+	/* If the device has one vchan the user does not need to supply the
+	 * vchan id and only the device id is needed, no extra parameters.
+	 */
+	if (dma_info.nb_vchans == 1 && *end_param == '\0')
+		vchan_id = 0;
+	else {
+		vchan_param = strtok(end_param, ",");
+		if (!vchan_param || strlen(vchan_param) == 0 || !isdigit(*vchan_param))
+			return -EINVAL;
+
+		vchan_id = strtoul(vchan_param, &end_param, 0);
+	}
+	if (*end_param != '\0')
+		RTE_DMA_LOG(WARNING, "Extra parameters passed to dmadev telemetry command, ignoring");
+
+	ret = rte_dma_stats_get(dev_id, vchan_id, &dma_stats);
+	if (ret < 0)
+		return -EINVAL;
+
+	rte_tel_data_start_dict(d);
+	ADD_DICT_STAT(submitted);
+	ADD_DICT_STAT(completed);
+	ADD_DICT_STAT(errors);
+
+	return 0;
+}
+
+RTE_INIT(dmadev_init_telemetry)
+{
+	rte_telemetry_register_cmd("/dmadev/list", dmadev_handle_dev_list,
+			"Returns list of available dmadev devices by IDs. No parameters.");
+	rte_telemetry_register_cmd("/dmadev/info", dmadev_handle_dev_info,
+			"Returns information for a dmadev. Parameters: int dev_id");
+	rte_telemetry_register_cmd("/dmadev/stats", dmadev_handle_dev_stats,
+			"Returns the stats for a dmadev vchannel. Parameters: int dev_id, vchan_id (Optional if only one vchannel)");
+}
-- 
2.25.1


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v3] dmadev: add telemetry support
  2022-04-01 10:24   ` [PATCH v3] " Sean Morrissey
@ 2022-04-01 10:50     ` Bruce Richardson
  2022-04-01 11:00       ` Walsh, Conor
  2022-04-01 14:53     ` [PATCH v4] " Sean Morrissey
  1 sibling, 1 reply; 15+ messages in thread
From: Bruce Richardson @ 2022-04-01 10:50 UTC (permalink / raw)
  To: Sean Morrissey; +Cc: Chengwen Feng, Kevin Laatz, dev, Sunil Pai G

On Fri, Apr 01, 2022 at 10:24:02AM +0000, Sean Morrissey wrote:
> Telemetry commands are now registered through the dmadev library
> for the gathering of DSA stats. The corresponding callback
> functions for listing dmadevs and providing info and stats for a
> specific dmadev are implemented in the dmadev library.
> 
> An example usage can be seen below:
> 
> Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
> {"version": "DPDK 22.03.0-rc2", "pid": 2956551, "max_output_len": 16384}
> Connected to application: "dpdk-dma"
> --> /
> {"/": ["/", "/dmadev/info", "/dmadev/list", "/dmadev/stats", ...]}
> --> /dmadev/list
> {"/dmadev/list": [0, 1]}
> --> /dmadev/info,0
> {"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1, "numa_node": 0,
> "max_vchans": 1, "max_desc": 4096, "min_desc": 32, "max_sges": 0,
> "capabilities": {"fill": 1, "sva": 0, "silent": 0, ...}}}
> --> /dmadev/stats,0,0
> {"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}}
> 
> Signed-off-by: Sean Morrissey <sean.morrissey@intel.com>
> Tested-by: Sunil Pai G <sunil.pai.g@intel.com>

Reviewed-by: Bruce Richardson <bruce.richardson@intel.com>

One comment inline below, which I'd like feedback from others on.
> ---
> V3:
> * update docs with correct examples
> * code cleanup and added comments
<snip>

> +
> +#define ADD_CAPA(c, s) rte_tel_data_add_dict_int(dma_caps, #c, !!(dev_capa & RTE_DMA_CAPA_ ## s))
> +
> +static int
> +dmadev_handle_dev_info(const char *cmd __rte_unused,
> +		const char *params, struct rte_tel_data *d)
> +{
> +	struct rte_dma_info dma_info;
> +	struct rte_tel_data *dma_caps;
<snip>
> +	dma_caps = rte_tel_data_alloc();
> +	if (!dma_caps)
> +		return -ENOMEM;
> +
> +	rte_tel_data_start_dict(dma_caps);
> +	ADD_CAPA(fill, OPS_FILL);
> +	ADD_CAPA(sva, SVA);
> +	ADD_CAPA(silent, SILENT);
> +	ADD_CAPA(copy, OPS_COPY);
> +	ADD_CAPA(mem2mem, MEM_TO_MEM);

I'm not 100% sure about this approach of having slightly different names
compared to the flags, just to have things in lower-case. Looking to have
some more input here - I'd tend to have the capabilities in upper case to
avoid duplicating parameters, but I'm not massively concerned either way.

> +	ADD_CAPA(mem2dev, MEM_TO_DEV);
> +	ADD_CAPA(dev2mem, DEV_TO_MEM);
> +	ADD_CAPA(dev2dev, DEV_TO_DEV);
> +	ADD_CAPA(copy_sg, OPS_COPY_SG);
> +	ADD_CAPA(handles_errors, HANDLES_ERRORS);
> +	rte_tel_data_add_dict_container(d, "capabilities", dma_caps, 0);
> +
> +	return 0;
> +}

^ permalink raw reply	[flat|nested] 15+ messages in thread

* RE: [PATCH v3] dmadev: add telemetry support
  2022-04-01 10:50     ` Bruce Richardson
@ 2022-04-01 11:00       ` Walsh, Conor
  2022-04-01 12:58         ` Morrissey, Sean
  0 siblings, 1 reply; 15+ messages in thread
From: Walsh, Conor @ 2022-04-01 11:00 UTC (permalink / raw)
  To: Richardson, Bruce, Morrissey, Sean
  Cc: Chengwen Feng, Laatz, Kevin, dev, Pai G, Sunil

> From: Bruce Richardson <bruce.richardson@intel.com>
> Sent: Friday 1 April 2022 11:50
> To: Morrissey, Sean <sean.morrissey@intel.com>
> Cc: Chengwen Feng <fengchengwen@huawei.com>; Laatz, Kevin
> <kevin.laatz@intel.com>; dev@dpdk.org; Pai G, Sunil
> <sunil.pai.g@intel.com>
> Subject: Re: [PATCH v3] dmadev: add telemetry support
> 
> On Fri, Apr 01, 2022 at 10:24:02AM +0000, Sean Morrissey wrote:
> > Telemetry commands are now registered through the dmadev library
> > for the gathering of DSA stats. The corresponding callback
> > functions for listing dmadevs and providing info and stats for a
> > specific dmadev are implemented in the dmadev library.
> >
> > An example usage can be seen below:
> >
> > Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
> > {"version": "DPDK 22.03.0-rc2", "pid": 2956551, "max_output_len": 16384}
> > Connected to application: "dpdk-dma"
> > --> /
> > {"/": ["/", "/dmadev/info", "/dmadev/list", "/dmadev/stats", ...]}
> > --> /dmadev/list
> > {"/dmadev/list": [0, 1]}
> > --> /dmadev/info,0
> > {"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1, "numa_node":
> 0,
> > "max_vchans": 1, "max_desc": 4096, "min_desc": 32, "max_sges": 0,
> > "capabilities": {"fill": 1, "sva": 0, "silent": 0, ...}}}
> > --> /dmadev/stats,0,0
> > {"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}}
> >
> > Signed-off-by: Sean Morrissey <sean.morrissey@intel.com>
> > Tested-by: Sunil Pai G <sunil.pai.g@intel.com>
> 
> Reviewed-by: Bruce Richardson <bruce.richardson@intel.com>

Hi Sean,

I'd agree with Bruce's comment below about trying to keep the names the same.
Looks good to me though and I've tested it with IOAT and dmafwd.

Thanks,
Reviewed-by: Conor Walsh <conor.walsh@intel.com>

> 
> One comment inline below, which I'd like feedback from others on.
> > ---
> > V3:
> > * update docs with correct examples
> > * code cleanup and added comments
> <snip>
> 
> > +
> > +#define ADD_CAPA(c, s) rte_tel_data_add_dict_int(dma_caps, #c,
> !!(dev_capa & RTE_DMA_CAPA_ ## s))
> > +
> > +static int
> > +dmadev_handle_dev_info(const char *cmd __rte_unused,
> > +		const char *params, struct rte_tel_data *d)
> > +{
> > +	struct rte_dma_info dma_info;
> > +	struct rte_tel_data *dma_caps;
> <snip>
> > +	dma_caps = rte_tel_data_alloc();
> > +	if (!dma_caps)
> > +		return -ENOMEM;
> > +
> > +	rte_tel_data_start_dict(dma_caps);
> > +	ADD_CAPA(fill, OPS_FILL);
> > +	ADD_CAPA(sva, SVA);
> > +	ADD_CAPA(silent, SILENT);
> > +	ADD_CAPA(copy, OPS_COPY);
> > +	ADD_CAPA(mem2mem, MEM_TO_MEM);
> 
> I'm not 100% sure about this approach of having slightly different names
> compared to the flags, just to have things in lower-case. Looking to have
> some more input here - I'd tend to have the capabilities in upper case to
> avoid duplicating parameters, but I'm not massively concerned either way.
> 
> > +	ADD_CAPA(mem2dev, MEM_TO_DEV);
> > +	ADD_CAPA(dev2mem, DEV_TO_MEM);
> > +	ADD_CAPA(dev2dev, DEV_TO_DEV);
> > +	ADD_CAPA(copy_sg, OPS_COPY_SG);
> > +	ADD_CAPA(handles_errors, HANDLES_ERRORS);
> > +	rte_tel_data_add_dict_container(d, "capabilities", dma_caps, 0);
> > +
> > +	return 0;
> > +}

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v3] dmadev: add telemetry support
  2022-04-01 11:00       ` Walsh, Conor
@ 2022-04-01 12:58         ` Morrissey, Sean
  2022-04-01 13:26           ` Bruce Richardson
  0 siblings, 1 reply; 15+ messages in thread
From: Morrissey, Sean @ 2022-04-01 12:58 UTC (permalink / raw)
  To: Walsh, Conor, Richardson, Bruce
  Cc: Chengwen Feng, Laatz, Kevin, dev, Pai G, Sunil


On 01/04/2022 12:00, Walsh, Conor wrote:
>> From: Bruce Richardson <bruce.richardson@intel.com>
>> Sent: Friday 1 April 2022 11:50
>> To: Morrissey, Sean <sean.morrissey@intel.com>
>> Cc: Chengwen Feng <fengchengwen@huawei.com>; Laatz, Kevin
>> <kevin.laatz@intel.com>; dev@dpdk.org; Pai G, Sunil
>> <sunil.pai.g@intel.com>
>> Subject: Re: [PATCH v3] dmadev: add telemetry support
>>
>> On Fri, Apr 01, 2022 at 10:24:02AM +0000, Sean Morrissey wrote:
>>> Telemetry commands are now registered through the dmadev library
>>> for the gathering of DSA stats. The corresponding callback
>>> functions for listing dmadevs and providing info and stats for a
>>> specific dmadev are implemented in the dmadev library.
>>>
>>> An example usage can be seen below:
>>>
>>> Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
>>> {"version": "DPDK 22.03.0-rc2", "pid": 2956551, "max_output_len": 16384}
>>> Connected to application: "dpdk-dma"
>>> --> /
>>> {"/": ["/", "/dmadev/info", "/dmadev/list", "/dmadev/stats", ...]}
>>> --> /dmadev/list
>>> {"/dmadev/list": [0, 1]}
>>> --> /dmadev/info,0
>>> {"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1, "numa_node":
>> 0,
>>> "max_vchans": 1, "max_desc": 4096, "min_desc": 32, "max_sges": 0,
>>> "capabilities": {"fill": 1, "sva": 0, "silent": 0, ...}}}
>>> --> /dmadev/stats,0,0
>>> {"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}}
>>>
>>> Signed-off-by: Sean Morrissey <sean.morrissey@intel.com>
>>> Tested-by: Sunil Pai G <sunil.pai.g@intel.com>
>> Reviewed-by: Bruce Richardson <bruce.richardson@intel.com>
> Hi Sean,
>
> I'd agree with Bruce's comment below about trying to keep the names the same.
> Looks good to me though and I've tested it with IOAT and dmafwd.
>
> Thanks,
> Reviewed-by: Conor Walsh <conor.walsh@intel.com>
>
>> One comment inline below, which I'd like feedback from others on.
>>> ---
>>> V3:
>>> * update docs with correct examples
>>> * code cleanup and added comments
>> <snip>
>>
>>> +
>>> +#define ADD_CAPA(c, s) rte_tel_data_add_dict_int(dma_caps, #c,
>> !!(dev_capa & RTE_DMA_CAPA_ ## s))
>>> +
>>> +static int
>>> +dmadev_handle_dev_info(const char *cmd __rte_unused,
>>> +		const char *params, struct rte_tel_data *d)
>>> +{
>>> +	struct rte_dma_info dma_info;
>>> +	struct rte_tel_data *dma_caps;
>> <snip>
>>> +	dma_caps = rte_tel_data_alloc();
>>> +	if (!dma_caps)
>>> +		return -ENOMEM;
>>> +
>>> +	rte_tel_data_start_dict(dma_caps);
>>> +	ADD_CAPA(fill, OPS_FILL);
>>> +	ADD_CAPA(sva, SVA);
>>> +	ADD_CAPA(silent, SILENT);
>>> +	ADD_CAPA(copy, OPS_COPY);
>>> +	ADD_CAPA(mem2mem, MEM_TO_MEM);
>> I'm not 100% sure about this approach of having slightly different names
>> compared to the flags, just to have things in lower-case. Looking to have
>> some more input here - I'd tend to have the capabilities in upper case to
>> avoid duplicating parameters, but I'm not massively concerned either way.

Hi all,

If that is the preferred approach then I will send another version. I 
got the lower case

names from the capa_names struct in the dma_capability_name() function 
and these

naming conventions are also used in the logs i.e. "Device %d don't 
support mem2mem transfer".

For this reason, I thought this was the preferred approach to naming the 
capabilities, however

I will keep the names consistent with the flags as suggested.

>>> +	ADD_CAPA(mem2dev, MEM_TO_DEV);
>>> +	ADD_CAPA(dev2mem, DEV_TO_MEM);
>>> +	ADD_CAPA(dev2dev, DEV_TO_DEV);
>>> +	ADD_CAPA(copy_sg, OPS_COPY_SG);
>>> +	ADD_CAPA(handles_errors, HANDLES_ERRORS);
>>> +	rte_tel_data_add_dict_container(d, "capabilities", dma_caps, 0);
>>> +
>>> +	return 0;
>>> +}

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v3] dmadev: add telemetry support
  2022-04-01 12:58         ` Morrissey, Sean
@ 2022-04-01 13:26           ` Bruce Richardson
  0 siblings, 0 replies; 15+ messages in thread
From: Bruce Richardson @ 2022-04-01 13:26 UTC (permalink / raw)
  To: Morrissey, Sean
  Cc: Walsh, Conor, Chengwen Feng, Laatz, Kevin, dev, Pai G, Sunil

On Fri, Apr 01, 2022 at 01:58:49PM +0100, Morrissey, Sean wrote:
> 
> On 01/04/2022 12:00, Walsh, Conor wrote:
> > > From: Bruce Richardson <bruce.richardson@intel.com>
> > > Sent: Friday 1 April 2022 11:50
> > > To: Morrissey, Sean <sean.morrissey@intel.com>
> > > Cc: Chengwen Feng <fengchengwen@huawei.com>; Laatz, Kevin
> > > <kevin.laatz@intel.com>; dev@dpdk.org; Pai G, Sunil
> > > <sunil.pai.g@intel.com>
> > > Subject: Re: [PATCH v3] dmadev: add telemetry support
> > > 
> > > On Fri, Apr 01, 2022 at 10:24:02AM +0000, Sean Morrissey wrote:
> > > > Telemetry commands are now registered through the dmadev library
> > > > for the gathering of DSA stats. The corresponding callback
> > > > functions for listing dmadevs and providing info and stats for a
> > > > specific dmadev are implemented in the dmadev library.
> > > > 
> > > > An example usage can be seen below:
> > > > 
> > > > Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
> > > > {"version": "DPDK 22.03.0-rc2", "pid": 2956551, "max_output_len": 16384}
> > > > Connected to application: "dpdk-dma"
> > > > --> /
> > > > {"/": ["/", "/dmadev/info", "/dmadev/list", "/dmadev/stats", ...]}
> > > > --> /dmadev/list
> > > > {"/dmadev/list": [0, 1]}
> > > > --> /dmadev/info,0
> > > > {"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1, "numa_node":
> > > 0,
> > > > "max_vchans": 1, "max_desc": 4096, "min_desc": 32, "max_sges": 0,
> > > > "capabilities": {"fill": 1, "sva": 0, "silent": 0, ...}}}
> > > > --> /dmadev/stats,0,0
> > > > {"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}}
> > > > 
> > > > Signed-off-by: Sean Morrissey <sean.morrissey@intel.com>
> > > > Tested-by: Sunil Pai G <sunil.pai.g@intel.com>
> > > Reviewed-by: Bruce Richardson <bruce.richardson@intel.com>
> > Hi Sean,
> > 
> > I'd agree with Bruce's comment below about trying to keep the names the same.
> > Looks good to me though and I've tested it with IOAT and dmafwd.
> > 
> > Thanks,
> > Reviewed-by: Conor Walsh <conor.walsh@intel.com>
> > 
> > > One comment inline below, which I'd like feedback from others on.
> > > > ---
> > > > V3:
> > > > * update docs with correct examples
> > > > * code cleanup and added comments
> > > <snip>
> > > 
> > > > +
> > > > +#define ADD_CAPA(c, s) rte_tel_data_add_dict_int(dma_caps, #c,
> > > !!(dev_capa & RTE_DMA_CAPA_ ## s))
> > > > +
> > > > +static int
> > > > +dmadev_handle_dev_info(const char *cmd __rte_unused,
> > > > +		const char *params, struct rte_tel_data *d)
> > > > +{
> > > > +	struct rte_dma_info dma_info;
> > > > +	struct rte_tel_data *dma_caps;
> > > <snip>
> > > > +	dma_caps = rte_tel_data_alloc();
> > > > +	if (!dma_caps)
> > > > +		return -ENOMEM;
> > > > +
> > > > +	rte_tel_data_start_dict(dma_caps);
> > > > +	ADD_CAPA(fill, OPS_FILL);
> > > > +	ADD_CAPA(sva, SVA);
> > > > +	ADD_CAPA(silent, SILENT);
> > > > +	ADD_CAPA(copy, OPS_COPY);
> > > > +	ADD_CAPA(mem2mem, MEM_TO_MEM);
> > > I'm not 100% sure about this approach of having slightly different names
> > > compared to the flags, just to have things in lower-case. Looking to have
> > > some more input here - I'd tend to have the capabilities in upper case to
> > > avoid duplicating parameters, but I'm not massively concerned either way.
> 
> Hi all,
> 
> If that is the preferred approach then I will send another version. I got
> the lower case
> 
> names from the capa_names struct in the dma_capability_name() function and
> these
> 
> naming conventions are also used in the logs i.e. "Device %d don't support
> mem2mem transfer".

My apologies, I didn't realise that that function and list of names
existed. Can that be used instead of hard-coding the names and values here?
Can we iterate through the array of names and check if the relevant bit
position is set?
> 
> For this reason, I thought this was the preferred approach to naming the
> capabilities, however
> 
> I will keep the names consistent with the flags as suggested.
> 
If there are printable names elsewhere that is what we should keep
consistent with. However, we should not duplicate those in this code, but
reuse existing defined names.

/Bruce

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v4] dmadev: add telemetry support
  2022-04-01 10:24   ` [PATCH v3] " Sean Morrissey
  2022-04-01 10:50     ` Bruce Richardson
@ 2022-04-01 14:53     ` Sean Morrissey
  2022-04-01 15:01       ` [PATCH v5] " Sean Morrissey
  1 sibling, 1 reply; 15+ messages in thread
From: Sean Morrissey @ 2022-04-01 14:53 UTC (permalink / raw)
  To: Chengwen Feng, Kevin Laatz, Bruce Richardson
  Cc: dev, Sean Morrissey, Sunil Pai G, Conor Walsh

Telemetry commands are now registered through the dmadev library
for the gathering of DSA stats. The corresponding callback
functions for listing dmadevs and providing info and stats for a
specific dmadev are implemented in the dmadev library.

An example usage can be seen below:

Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
{"version": "DPDK 22.03.0-rc2", "pid": 2956551, "max_output_len": 16384}
Connected to application: "dpdk-dma"
--> /
{"/": ["/", "/dmadev/info", "/dmadev/list", "/dmadev/stats", ...]}
--> /dmadev/list
{"/dmadev/list": [0, 1]}
--> /dmadev/info,0
{"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1, "numa_node": 0,
"max_vchans": 1, "max_desc": 4096, "min_desc": 32, "max_sges": 0,
"capabilities": {"mem2mem": 1, "mem2dev": 0, "dev2mem": 0, ...}}}
--> /dmadev/stats,0,0
{"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}}

Signed-off-by: Sean Morrissey <sean.morrissey@intel.com>
Tested-by: Sunil Pai G <sunil.pai.g@intel.com>
Reviewed-by: Bruce Richardson <bruce.richardson@intel.com>
Reviewed-by: Conor Walsh <conor.walsh@intel.com>
---
V4:
* get capability name from function
  instead of hardcoded
* fix checkpatch warnings
V3:
* update docs with correct examples
* code cleanup and added comments
V2:
* add device capabilities to info command
* no requirement to pass vchan id
  if the device only has one vchan
* minor code cleanup
---
 doc/guides/prog_guide/dmadev.rst       |  24 ++++
 doc/guides/rel_notes/release_22_07.rst |   5 +
 lib/dmadev/meson.build                 |   2 +
 lib/dmadev/rte_dmadev.c                | 162 ++++++++++++++++++++++---
 4 files changed, 177 insertions(+), 16 deletions(-)

diff --git a/doc/guides/prog_guide/dmadev.rst b/doc/guides/prog_guide/dmadev.rst
index 77863f8028..2aa26d33b8 100644
--- a/doc/guides/prog_guide/dmadev.rst
+++ b/doc/guides/prog_guide/dmadev.rst
@@ -118,3 +118,27 @@ i.e. ``rte_dma_stats_get()``. The statistics returned for each device instance a
 * ``submitted``: The number of operations submitted to the device.
 * ``completed``: The number of operations which have completed (successful and failed).
 * ``errors``: The number of operations that completed with error.
+
+The dmadev library has support for displaying DMA device information
+through the Telemetry interface. Telemetry commands that can be used
+are shown below.
+
+#. Get the list of available DMA devices by ID::
+
+     --> /dmadev/list
+     {"/dmadev/list": [0, 1]}
+
+#. Get general information from a DMA device by passing the device id as a parameter::
+
+     --> /dmadev/info,0
+     {"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1, "numa_node": 0, "max_vchans": 1, "max_desc": 4096,
+     "min_desc": 32, "max_sges": 0, "capabilities": {"mem2mem": 1, "mem2dev": 0, "dev2mem": 0, ...}}}
+
+#. Get the statistics for a particular DMA device and virtual DMA channel by passing the device id and vchan id as parameters
+   (if a DMA device only has one virtual DMA channel you only need to pass the device id)::
+
+     --> /dmadev/stats,0,0
+     {"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}}
+
+For more information on how to use the Telemetry interface, see
+the :doc:`../howto/telemetry`.
diff --git a/doc/guides/rel_notes/release_22_07.rst b/doc/guides/rel_notes/release_22_07.rst
index 42a5f2d990..d6c434ae7b 100644
--- a/doc/guides/rel_notes/release_22_07.rst
+++ b/doc/guides/rel_notes/release_22_07.rst
@@ -55,6 +55,11 @@ New Features
      Also, make sure to start the actual text at the margin.
      =======================================================
 
+* **Added telemetry callbacks to dmadev library.**
+
+  Added telemetry callback functions which allow for a list of DMA devices,
+  stats for a DMA device, and other DMA device information to be queried.
+
 
 Removed Items
 -------------
diff --git a/lib/dmadev/meson.build b/lib/dmadev/meson.build
index d2fc85e8c7..2f17587b75 100644
--- a/lib/dmadev/meson.build
+++ b/lib/dmadev/meson.build
@@ -5,3 +5,5 @@ sources = files('rte_dmadev.c')
 headers = files('rte_dmadev.h')
 indirect_headers += files('rte_dmadev_core.h')
 driver_sdk_headers += files('rte_dmadev_pmd.h')
+
+deps += ['telemetry']
diff --git a/lib/dmadev/rte_dmadev.c b/lib/dmadev/rte_dmadev.c
index d4b32b2971..efdad52545 100644
--- a/lib/dmadev/rte_dmadev.c
+++ b/lib/dmadev/rte_dmadev.c
@@ -11,6 +11,7 @@
 #include <rte_malloc.h>
 #include <rte_memzone.h>
 #include <rte_string_fns.h>
+#include <rte_telemetry.h>
 
 #include "rte_dmadev.h"
 #include "rte_dmadev_pmd.h"
@@ -27,6 +28,22 @@ static struct {
 	struct rte_dma_dev_data data[0];
 } *dma_devices_shared_data;
 
+static const struct {
+	uint64_t capability;
+	const char *name;
+} capa_names[] = {
+	{ RTE_DMA_CAPA_MEM_TO_MEM,  "mem2mem" },
+	{ RTE_DMA_CAPA_MEM_TO_DEV,  "mem2dev" },
+	{ RTE_DMA_CAPA_DEV_TO_MEM,  "dev2mem" },
+	{ RTE_DMA_CAPA_DEV_TO_DEV,  "dev2dev" },
+	{ RTE_DMA_CAPA_SVA,         "sva"     },
+	{ RTE_DMA_CAPA_SILENT,      "silent"  },
+	{ RTE_DMA_CAPA_HANDLES_ERRORS, "handles_errors" },
+	{ RTE_DMA_CAPA_OPS_COPY,    "copy"    },
+	{ RTE_DMA_CAPA_OPS_COPY_SG, "copy_sg" },
+	{ RTE_DMA_CAPA_OPS_FILL,    "fill"    },
+};
+
 RTE_LOG_REGISTER_DEFAULT(rte_dma_logtype, INFO);
 #define RTE_DMA_LOG(level, ...) \
 	rte_log(RTE_LOG_ ## level, rte_dma_logtype, RTE_FMT("dma: " \
@@ -712,22 +729,6 @@ rte_dma_vchan_status(int16_t dev_id, uint16_t vchan, enum rte_dma_vchan_status *
 static const char *
 dma_capability_name(uint64_t capability)
 {
-	static const struct {
-		uint64_t capability;
-		const char *name;
-	} capa_names[] = {
-		{ RTE_DMA_CAPA_MEM_TO_MEM,  "mem2mem" },
-		{ RTE_DMA_CAPA_MEM_TO_DEV,  "mem2dev" },
-		{ RTE_DMA_CAPA_DEV_TO_MEM,  "dev2mem" },
-		{ RTE_DMA_CAPA_DEV_TO_DEV,  "dev2dev" },
-		{ RTE_DMA_CAPA_SVA,         "sva"     },
-		{ RTE_DMA_CAPA_SILENT,      "silent"  },
-		{ RTE_DMA_CAPA_HANDLES_ERRORS, "handles_errors" },
-		{ RTE_DMA_CAPA_OPS_COPY,    "copy"    },
-		{ RTE_DMA_CAPA_OPS_COPY_SG, "copy_sg" },
-		{ RTE_DMA_CAPA_OPS_FILL,    "fill"    },
-	};
-
 	const char *name = "unknown";
 	uint32_t i;
 
@@ -864,3 +865,132 @@ dma_fp_object_dummy(struct rte_dma_fp_object *obj)
 	obj->completed_status = dummy_completed_status;
 	obj->burst_capacity   = dummy_burst_capacity;
 }
+
+static int
+dmadev_handle_dev_list(const char *cmd __rte_unused,
+		const char *params __rte_unused,
+		struct rte_tel_data *d)
+{
+	int dev_id;
+
+	rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
+	for (dev_id = 0; dev_id < dma_devices_max; dev_id++)
+		if (rte_dma_is_valid(dev_id))
+			rte_tel_data_add_array_int(d, dev_id);
+
+	return 0;
+}
+
+#define ADD_CAPA(td, dc, c) rte_tel_data_add_dict_int(td, dma_capability_name(c), !!(dc & c))
+
+static int
+dmadev_handle_dev_info(const char *cmd __rte_unused,
+		const char *params, struct rte_tel_data *d)
+{
+	struct rte_dma_info dma_info;
+	struct rte_tel_data *dma_caps;
+	int dev_id, ret;
+	uint64_t dev_capa;
+	char *end_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -EINVAL;
+
+	dev_id = strtoul(params, &end_param, 0);
+	if (*end_param != '\0')
+		RTE_DMA_LOG(WARNING, "Extra parameters passed to dmadev telemetry command, ignoring");
+
+	/* Function info_get validates dev_id so we don't need to. */
+	ret = rte_dma_info_get(dev_id, &dma_info);
+	if (ret < 0)
+		return -EINVAL;
+	dev_capa = dma_info.dev_capa;
+
+	rte_tel_data_start_dict(d);
+	rte_tel_data_add_dict_string(d, "name", dma_info.dev_name);
+	rte_tel_data_add_dict_int(d, "nb_vchans", dma_info.nb_vchans);
+	rte_tel_data_add_dict_int(d, "numa_node", dma_info.numa_node);
+	rte_tel_data_add_dict_int(d, "max_vchans", dma_info.max_vchans);
+	rte_tel_data_add_dict_int(d, "max_desc", dma_info.max_desc);
+	rte_tel_data_add_dict_int(d, "min_desc", dma_info.min_desc);
+	rte_tel_data_add_dict_int(d, "max_sges", dma_info.max_sges);
+
+	dma_caps = rte_tel_data_alloc();
+	if (!dma_caps)
+		return -ENOMEM;
+
+	rte_tel_data_start_dict(dma_caps);
+	ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_MEM_TO_MEM);
+	ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_MEM_TO_DEV);
+	ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_DEV_TO_MEM);
+	ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_DEV_TO_DEV);
+	ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_SVA);
+	ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_SILENT);
+	ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_HANDLES_ERRORS);
+	ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_OPS_COPY);
+	ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_OPS_COPY_SG);
+	ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_OPS_FILL);
+	rte_tel_data_add_dict_container(d, "capabilities", dma_caps, 0);
+
+	return 0;
+}
+
+#define ADD_DICT_STAT(s) rte_tel_data_add_dict_u64(d, #s, dma_stats.s)
+
+static int
+dmadev_handle_dev_stats(const char *cmd __rte_unused,
+		const char *params,
+		struct rte_tel_data *d)
+{
+	struct rte_dma_info dma_info;
+	struct rte_dma_stats dma_stats;
+	int dev_id, ret, vchan_id;
+	char *end_param;
+	const char *vchan_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -EINVAL;
+
+	dev_id = strtoul(params, &end_param, 0);
+
+	/* Function info_get validates dev_id so we don't need to. */
+	ret = rte_dma_info_get(dev_id, &dma_info);
+	if (ret < 0)
+		return -EINVAL;
+
+	/* If the device has one vchan the user does not need to supply the
+	 * vchan id and only the device id is needed, no extra parameters.
+	 */
+	if (dma_info.nb_vchans == 1 && *end_param == '\0')
+		vchan_id = 0;
+	else {
+		vchan_param = strtok(end_param, ",");
+		if (!vchan_param || strlen(vchan_param) == 0 || !isdigit(*vchan_param))
+			return -EINVAL;
+
+		vchan_id = strtoul(vchan_param, &end_param, 0);
+	}
+	if (*end_param != '\0')
+		RTE_DMA_LOG(WARNING, "Extra parameters passed to dmadev telemetry command, ignoring");
+
+	ret = rte_dma_stats_get(dev_id, vchan_id, &dma_stats);
+	if (ret < 0)
+		return -EINVAL;
+
+	rte_tel_data_start_dict(d);
+	ADD_DICT_STAT(submitted);
+	ADD_DICT_STAT(completed);
+	ADD_DICT_STAT(errors);
+
+	return 0;
+}
+
+RTE_INIT(dmadev_init_telemetry)
+{
+	rte_telemetry_register_cmd("/dmadev/list", dmadev_handle_dev_list,
+			"Returns list of available dmadev devices by IDs. No parameters.");
+	rte_telemetry_register_cmd("/dmadev/info", dmadev_handle_dev_info,
+			"Returns information for a dmadev. Parameters: int dev_id");
+	rte_telemetry_register_cmd("/dmadev/stats", dmadev_handle_dev_stats,
+			"Returns the stats for a dmadev vchannel. Parameters: int dev_id, vchan_id (Optional if only one vchannel)");
+}
-- 
2.25.1


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v5] dmadev: add telemetry support
  2022-04-01 14:53     ` [PATCH v4] " Sean Morrissey
@ 2022-04-01 15:01       ` Sean Morrissey
  2022-04-01 15:13         ` Kevin Laatz
  2022-04-12  8:04         ` fengchengwen
  0 siblings, 2 replies; 15+ messages in thread
From: Sean Morrissey @ 2022-04-01 15:01 UTC (permalink / raw)
  To: Chengwen Feng, Kevin Laatz, Bruce Richardson
  Cc: dev, Sean Morrissey, Sunil Pai G, Conor Walsh

Telemetry commands are now registered through the dmadev library
for the gathering of DSA stats. The corresponding callback
functions for listing dmadevs and providing info and stats for a
specific dmadev are implemented in the dmadev library.

An example usage can be seen below:

Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
{"version": "DPDK 22.03.0-rc2", "pid": 2956551, "max_output_len": 16384}
Connected to application: "dpdk-dma"
--> /
{"/": ["/", "/dmadev/info", "/dmadev/list", "/dmadev/stats", ...]}
--> /dmadev/list
{"/dmadev/list": [0, 1]}
--> /dmadev/info,0
{"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1, "numa_node": 0,
"max_vchans": 1, "max_desc": 4096, "min_desc": 32, "max_sges": 0,
"capabilities": {"mem2mem": 1, "mem2dev": 0, "dev2mem": 0, ...}}}
--> /dmadev/stats,0,0
{"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}}

Signed-off-by: Sean Morrissey <sean.morrissey@intel.com>
Tested-by: Sunil Pai G <sunil.pai.g@intel.com>
Reviewed-by: Bruce Richardson <bruce.richardson@intel.com>
Reviewed-by: Conor Walsh <conor.walsh@intel.com>
---
V5:
* move capa_names struct back to function
V4:
* get capability name from function
  instead of hardcoded
* fix checkpatch warnings
V3:
* update docs with correct examples
* code cleanup and added comments
V2:
* add device capabilities to info command
* no requirement to pass vchan id
  if the device only has one vchan
* minor code cleanup
---
 doc/guides/prog_guide/dmadev.rst       |  24 +++++
 doc/guides/rel_notes/release_22_07.rst |   5 +
 lib/dmadev/meson.build                 |   2 +
 lib/dmadev/rte_dmadev.c                | 130 +++++++++++++++++++++++++
 4 files changed, 161 insertions(+)

diff --git a/doc/guides/prog_guide/dmadev.rst b/doc/guides/prog_guide/dmadev.rst
index 77863f8028..2aa26d33b8 100644
--- a/doc/guides/prog_guide/dmadev.rst
+++ b/doc/guides/prog_guide/dmadev.rst
@@ -118,3 +118,27 @@ i.e. ``rte_dma_stats_get()``. The statistics returned for each device instance a
 * ``submitted``: The number of operations submitted to the device.
 * ``completed``: The number of operations which have completed (successful and failed).
 * ``errors``: The number of operations that completed with error.
+
+The dmadev library has support for displaying DMA device information
+through the Telemetry interface. Telemetry commands that can be used
+are shown below.
+
+#. Get the list of available DMA devices by ID::
+
+     --> /dmadev/list
+     {"/dmadev/list": [0, 1]}
+
+#. Get general information from a DMA device by passing the device id as a parameter::
+
+     --> /dmadev/info,0
+     {"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1, "numa_node": 0, "max_vchans": 1, "max_desc": 4096,
+     "min_desc": 32, "max_sges": 0, "capabilities": {"mem2mem": 1, "mem2dev": 0, "dev2mem": 0, ...}}}
+
+#. Get the statistics for a particular DMA device and virtual DMA channel by passing the device id and vchan id as parameters
+   (if a DMA device only has one virtual DMA channel you only need to pass the device id)::
+
+     --> /dmadev/stats,0,0
+     {"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}}
+
+For more information on how to use the Telemetry interface, see
+the :doc:`../howto/telemetry`.
diff --git a/doc/guides/rel_notes/release_22_07.rst b/doc/guides/rel_notes/release_22_07.rst
index 42a5f2d990..d6c434ae7b 100644
--- a/doc/guides/rel_notes/release_22_07.rst
+++ b/doc/guides/rel_notes/release_22_07.rst
@@ -55,6 +55,11 @@ New Features
      Also, make sure to start the actual text at the margin.
      =======================================================
 
+* **Added telemetry callbacks to dmadev library.**
+
+  Added telemetry callback functions which allow for a list of DMA devices,
+  stats for a DMA device, and other DMA device information to be queried.
+
 
 Removed Items
 -------------
diff --git a/lib/dmadev/meson.build b/lib/dmadev/meson.build
index d2fc85e8c7..2f17587b75 100644
--- a/lib/dmadev/meson.build
+++ b/lib/dmadev/meson.build
@@ -5,3 +5,5 @@ sources = files('rte_dmadev.c')
 headers = files('rte_dmadev.h')
 indirect_headers += files('rte_dmadev_core.h')
 driver_sdk_headers += files('rte_dmadev_pmd.h')
+
+deps += ['telemetry']
diff --git a/lib/dmadev/rte_dmadev.c b/lib/dmadev/rte_dmadev.c
index d4b32b2971..174d4c40ae 100644
--- a/lib/dmadev/rte_dmadev.c
+++ b/lib/dmadev/rte_dmadev.c
@@ -11,6 +11,7 @@
 #include <rte_malloc.h>
 #include <rte_memzone.h>
 #include <rte_string_fns.h>
+#include <rte_telemetry.h>
 
 #include "rte_dmadev.h"
 #include "rte_dmadev_pmd.h"
@@ -864,3 +865,132 @@ dma_fp_object_dummy(struct rte_dma_fp_object *obj)
 	obj->completed_status = dummy_completed_status;
 	obj->burst_capacity   = dummy_burst_capacity;
 }
+
+static int
+dmadev_handle_dev_list(const char *cmd __rte_unused,
+		const char *params __rte_unused,
+		struct rte_tel_data *d)
+{
+	int dev_id;
+
+	rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
+	for (dev_id = 0; dev_id < dma_devices_max; dev_id++)
+		if (rte_dma_is_valid(dev_id))
+			rte_tel_data_add_array_int(d, dev_id);
+
+	return 0;
+}
+
+#define ADD_CAPA(td, dc, c) rte_tel_data_add_dict_int(td, dma_capability_name(c), !!(dc & c))
+
+static int
+dmadev_handle_dev_info(const char *cmd __rte_unused,
+		const char *params, struct rte_tel_data *d)
+{
+	struct rte_dma_info dma_info;
+	struct rte_tel_data *dma_caps;
+	int dev_id, ret;
+	uint64_t dev_capa;
+	char *end_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -EINVAL;
+
+	dev_id = strtoul(params, &end_param, 0);
+	if (*end_param != '\0')
+		RTE_DMA_LOG(WARNING, "Extra parameters passed to dmadev telemetry command, ignoring");
+
+	/* Function info_get validates dev_id so we don't need to. */
+	ret = rte_dma_info_get(dev_id, &dma_info);
+	if (ret < 0)
+		return -EINVAL;
+	dev_capa = dma_info.dev_capa;
+
+	rte_tel_data_start_dict(d);
+	rte_tel_data_add_dict_string(d, "name", dma_info.dev_name);
+	rte_tel_data_add_dict_int(d, "nb_vchans", dma_info.nb_vchans);
+	rte_tel_data_add_dict_int(d, "numa_node", dma_info.numa_node);
+	rte_tel_data_add_dict_int(d, "max_vchans", dma_info.max_vchans);
+	rte_tel_data_add_dict_int(d, "max_desc", dma_info.max_desc);
+	rte_tel_data_add_dict_int(d, "min_desc", dma_info.min_desc);
+	rte_tel_data_add_dict_int(d, "max_sges", dma_info.max_sges);
+
+	dma_caps = rte_tel_data_alloc();
+	if (!dma_caps)
+		return -ENOMEM;
+
+	rte_tel_data_start_dict(dma_caps);
+	ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_MEM_TO_MEM);
+	ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_MEM_TO_DEV);
+	ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_DEV_TO_MEM);
+	ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_DEV_TO_DEV);
+	ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_SVA);
+	ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_SILENT);
+	ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_HANDLES_ERRORS);
+	ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_OPS_COPY);
+	ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_OPS_COPY_SG);
+	ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_OPS_FILL);
+	rte_tel_data_add_dict_container(d, "capabilities", dma_caps, 0);
+
+	return 0;
+}
+
+#define ADD_DICT_STAT(s) rte_tel_data_add_dict_u64(d, #s, dma_stats.s)
+
+static int
+dmadev_handle_dev_stats(const char *cmd __rte_unused,
+		const char *params,
+		struct rte_tel_data *d)
+{
+	struct rte_dma_info dma_info;
+	struct rte_dma_stats dma_stats;
+	int dev_id, ret, vchan_id;
+	char *end_param;
+	const char *vchan_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -EINVAL;
+
+	dev_id = strtoul(params, &end_param, 0);
+
+	/* Function info_get validates dev_id so we don't need to. */
+	ret = rte_dma_info_get(dev_id, &dma_info);
+	if (ret < 0)
+		return -EINVAL;
+
+	/* If the device has one vchan the user does not need to supply the
+	 * vchan id and only the device id is needed, no extra parameters.
+	 */
+	if (dma_info.nb_vchans == 1 && *end_param == '\0')
+		vchan_id = 0;
+	else {
+		vchan_param = strtok(end_param, ",");
+		if (!vchan_param || strlen(vchan_param) == 0 || !isdigit(*vchan_param))
+			return -EINVAL;
+
+		vchan_id = strtoul(vchan_param, &end_param, 0);
+	}
+	if (*end_param != '\0')
+		RTE_DMA_LOG(WARNING, "Extra parameters passed to dmadev telemetry command, ignoring");
+
+	ret = rte_dma_stats_get(dev_id, vchan_id, &dma_stats);
+	if (ret < 0)
+		return -EINVAL;
+
+	rte_tel_data_start_dict(d);
+	ADD_DICT_STAT(submitted);
+	ADD_DICT_STAT(completed);
+	ADD_DICT_STAT(errors);
+
+	return 0;
+}
+
+RTE_INIT(dmadev_init_telemetry)
+{
+	rte_telemetry_register_cmd("/dmadev/list", dmadev_handle_dev_list,
+			"Returns list of available dmadev devices by IDs. No parameters.");
+	rte_telemetry_register_cmd("/dmadev/info", dmadev_handle_dev_info,
+			"Returns information for a dmadev. Parameters: int dev_id");
+	rte_telemetry_register_cmd("/dmadev/stats", dmadev_handle_dev_stats,
+			"Returns the stats for a dmadev vchannel. Parameters: int dev_id, vchan_id (Optional if only one vchannel)");
+}
-- 
2.25.1


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v5] dmadev: add telemetry support
  2022-04-01 15:01       ` [PATCH v5] " Sean Morrissey
@ 2022-04-01 15:13         ` Kevin Laatz
  2022-04-12  8:04         ` fengchengwen
  1 sibling, 0 replies; 15+ messages in thread
From: Kevin Laatz @ 2022-04-01 15:13 UTC (permalink / raw)
  To: Sean Morrissey, Chengwen Feng, Bruce Richardson
  Cc: dev, Sunil Pai G, Conor Walsh

On 01/04/2022 16:01, Sean Morrissey wrote:
> Telemetry commands are now registered through the dmadev library
> for the gathering of DSA stats. The corresponding callback
> functions for listing dmadevs and providing info and stats for a
> specific dmadev are implemented in the dmadev library.
>
> An example usage can be seen below:
>
> Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
> {"version": "DPDK 22.03.0-rc2", "pid": 2956551, "max_output_len": 16384}
> Connected to application: "dpdk-dma"
> --> /
> {"/": ["/", "/dmadev/info", "/dmadev/list", "/dmadev/stats", ...]}
> --> /dmadev/list
> {"/dmadev/list": [0, 1]}
> --> /dmadev/info,0
> {"/dmadev/info": {"name": "0000:00:01.0", "nb_vchans": 1, "numa_node": 0,
> "max_vchans": 1, "max_desc": 4096, "min_desc": 32, "max_sges": 0,
> "capabilities": {"mem2mem": 1, "mem2dev": 0, "dev2mem": 0, ...}}}
> --> /dmadev/stats,0,0
> {"/dmadev/stats": {"submitted": 0, "completed": 0, "errors": 0}}
>
> Signed-off-by: Sean Morrissey <sean.morrissey@intel.com>
> Tested-by: Sunil Pai G <sunil.pai.g@intel.com>
> Reviewed-by: Bruce Richardson <bruce.richardson@intel.com>
> Reviewed-by: Conor Walsh <conor.walsh@intel.com>
> ---
> V5:
> * move capa_names struct back to function
> V4:
> * get capability name from function
>    instead of hardcoded
> * fix checkpatch warnings
> V3:
> * update docs with correct examples
> * code cleanup and added comments
> V2:
> * add device capabilities to info command
> * no requirement to pass vchan id
>    if the device only has one vchan
> * minor code cleanup
> ---
>   doc/guides/prog_guide/dmadev.rst       |  24 +++++
>   doc/guides/rel_notes/release_22_07.rst |   5 +
>   lib/dmadev/meson.build                 |   2 +
>   lib/dmadev/rte_dmadev.c                | 130 +++++++++++++++++++++++++
>   4 files changed, 161 insertions(+)
>
Thanks for adding this, Sean.

Tested-by: Kevin Laatz <kevin.laatz@intel.com>


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v5] dmadev: add telemetry support
  2022-04-01 15:01       ` [PATCH v5] " Sean Morrissey
  2022-04-01 15:13         ` Kevin Laatz
@ 2022-04-12  8:04         ` fengchengwen
  2022-06-05 23:27           ` Thomas Monjalon
  1 sibling, 1 reply; 15+ messages in thread
From: fengchengwen @ 2022-04-12  8:04 UTC (permalink / raw)
  To: Sean Morrissey, Kevin Laatz, Bruce Richardson
  Cc: dev, Sunil Pai G, Conor Walsh

Acked-by: Chengwen Feng <fengchengwen@huawei.com>

Thanks

On 2022/4/1 23:01, Sean Morrissey wrote:
> Telemetry commands are now registered through the dmadev library
> for the gathering of DSA stats. The corresponding callback
> functions for listing dmadevs and providing info and stats for a
> specific dmadev are implemented in the dmadev library.
> 
> An example usage can be seen below:
> 

...

> 


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v5] dmadev: add telemetry support
  2022-04-12  8:04         ` fengchengwen
@ 2022-06-05 23:27           ` Thomas Monjalon
  0 siblings, 0 replies; 15+ messages in thread
From: Thomas Monjalon @ 2022-06-05 23:27 UTC (permalink / raw)
  To: Sean Morrissey
  Cc: Kevin Laatz, Bruce Richardson, dev, Sunil Pai G, Conor Walsh,
	fengchengwen

> On 2022/4/1 23:01, Sean Morrissey wrote:
> > Telemetry commands are now registered through the dmadev library
> > for the gathering of DSA stats. The corresponding callback
> > functions for listing dmadevs and providing info and stats for a
> > specific dmadev are implemented in the dmadev library.

> Acked-by: Chengwen Feng <fengchengwen@huawei.com>

Applied, thanks.



^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2022-06-05 23:27 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-23 16:49 [PATCH v1] dmadev: add telemetry support Sean Morrissey
2022-03-25  9:29 ` Pai G, Sunil
2022-03-29 13:10 ` Bruce Richardson
2022-03-31 18:39 ` [PATCH v2] " Sean Morrissey
2022-04-01  8:39   ` Bruce Richardson
2022-04-01 10:24   ` [PATCH v3] " Sean Morrissey
2022-04-01 10:50     ` Bruce Richardson
2022-04-01 11:00       ` Walsh, Conor
2022-04-01 12:58         ` Morrissey, Sean
2022-04-01 13:26           ` Bruce Richardson
2022-04-01 14:53     ` [PATCH v4] " Sean Morrissey
2022-04-01 15:01       ` [PATCH v5] " Sean Morrissey
2022-04-01 15:13         ` Kevin Laatz
2022-04-12  8:04         ` fengchengwen
2022-06-05 23:27           ` Thomas Monjalon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).