* [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).