The cryptodev library now registers commands with telemetry, and implements the corresponding callback functions. These commands allow a list of cryptodevs and stats for a cryptodev to be queried. An example usage can be seen below: Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2 {"version": "DPDK 21.11.0-rc0", "pid": 1135019, "max_output_len": 16384} --> / {"/": ["/", "/cryptodev/list", "/cryptodev/stats", ...]} --> /cryptodev/list {"/cryptodev/list": {"0000:1a:01.0_qat_sym": 0, "0000:1a:01.0_qat_asym": \ 1}} --> /cryptodev/stats,0 {"/cryptodev/stats": {"enqueued_count": 0, "dequeued_count": 0, \ "enqueue_err_count": 0, "dequeue_err_count": 0}} Signed-off-by: Rebecca Troy <rebecca.troy@intel.com> --- lib/cryptodev/rte_cryptodev.c | 62 +++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/lib/cryptodev/rte_cryptodev.c b/lib/cryptodev/rte_cryptodev.c index 447aa9d519..1e3ab633cc 100644 --- a/lib/cryptodev/rte_cryptodev.c +++ b/lib/cryptodev/rte_cryptodev.c @@ -36,6 +36,7 @@ #include <rte_errno.h> #include <rte_spinlock.h> #include <rte_string_fns.h> +#include <rte_telemetry.h> #include "rte_crypto.h" #include "rte_cryptodev.h" @@ -2427,3 +2428,64 @@ rte_cryptodev_allocate_driver(struct cryptodev_driver *crypto_drv, return nb_drivers++; } + +static int +cryptodev_handle_dev_list(const char *cmd __rte_unused, + const char *params __rte_unused, + struct rte_tel_data *d) +{ + int dev_id; + + if (rte_cryptodev_count() < 1) + return -1; + + rte_tel_data_start_dict(d); + for (dev_id = 0; dev_id < RTE_CRYPTO_MAX_DEVS; dev_id++) + if (rte_cryptodev_pmd_is_valid_dev(dev_id)) + rte_tel_data_add_dict_int(d, + rte_cryptodev_name_get(dev_id), dev_id); + + return 0; +} + +#define ADD_DICT_STAT(stats, s) rte_tel_data_add_dict_u64(d, #s, stats.s) + +static int +cryptodev_handle_dev_stats(const char *cmd __rte_unused, + const char *params, + struct rte_tel_data *d) +{ + struct rte_cryptodev_stats cryptodev_stats; + int dev_id, ret; + char *end_param; + + if (params == NULL || strlen(params) == 0 || !isdigit(*params)) + return -1; + + dev_id = strtoul(params, &end_param, 0); + if (*end_param != '\0') + CDEV_LOG_ERR("Extra parameters passed to cryptodev telemetry command, ignoring"); + if (!rte_cryptodev_pmd_is_valid_dev(dev_id)) + return -1; + + ret = rte_cryptodev_stats_get(dev_id, &cryptodev_stats); + if (ret < 0) + return -1; + + rte_tel_data_start_dict(d); + ADD_DICT_STAT(cryptodev_stats, enqueued_count); + ADD_DICT_STAT(cryptodev_stats, dequeued_count); + ADD_DICT_STAT(cryptodev_stats, enqueue_err_count); + ADD_DICT_STAT(cryptodev_stats, dequeue_err_count); + + return 0; +} + +RTE_INIT(cryptodev_init_telemetry) +{ + rte_telemetry_register_cmd("/cryptodev/list", cryptodev_handle_dev_list, + "Returns list of available cryptodev names and IDs."); + rte_telemetry_register_cmd("/cryptodev/stats", + cryptodev_handle_dev_stats, + "Returns the stats for a cryptodev. Parameters: int dev_id"); +} -- 2.25.1
> -----Original Message-----
> From: Troy, Rebecca <rebecca.troy@intel.com>
> Sent: Thursday, August 19, 2021 11:22 AM
> To: dev@dpdk.org
> Cc: Zhang, Roy Fan <roy.fan.zhang@intel.com>; Power, Ciara
> <ciara.power@intel.com>; Troy, Rebecca <rebecca.troy@intel.com>; Akhil
> Goyal <gakhil@marvell.com>; Doherty, Declan <declan.doherty@intel.com>
> Subject: [PATCH] cryptodev: add telemetry callbacks
>
> The cryptodev library now registers commands with telemetry, and
> implements the corresponding callback functions. These commands
> allow a list of cryptodevs and stats for a cryptodev to be
> queried.
>
> An example usage can be seen below:
>
> Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
> {"version": "DPDK 21.11.0-rc0", "pid": 1135019, "max_output_len": 16384}
> --> /
> {"/": ["/", "/cryptodev/list", "/cryptodev/stats", ...]}
> --> /cryptodev/list
> {"/cryptodev/list": {"0000:1a:01.0_qat_sym": 0, "0000:1a:01.0_qat_asym": \
> 1}}
> --> /cryptodev/stats,0
> {"/cryptodev/stats": {"enqueued_count": 0, "dequeued_count": 0, \
> "enqueue_err_count": 0, "dequeue_err_count": 0}}
>
> Signed-off-by: Rebecca Troy <rebecca.troy@intel.com>
Acked-by: Fan Zhang <roy.fan.zhang@intel.com>
> The cryptodev library now registers commands with telemetry, and
> implements the corresponding callback functions. These commands
> allow a list of cryptodevs and stats for a cryptodev to be
> queried.
>
> An example usage can be seen below:
>
> Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
> {"version": "DPDK 21.11.0-rc0", "pid": 1135019, "max_output_len": 16384}
> --> /
> {"/": ["/", "/cryptodev/list", "/cryptodev/stats", ...]}
> --> /cryptodev/list
> {"/cryptodev/list": {"0000:1a:01.0_qat_sym": 0, "0000:1a:01.0_qat_asym": \
> 1}}
> --> /cryptodev/stats,0
> {"/cryptodev/stats": {"enqueued_count": 0, "dequeued_count": 0, \
> "enqueue_err_count": 0, "dequeue_err_count": 0}}
>
> Signed-off-by: Rebecca Troy <rebecca.troy@intel.com>
> ---
Can we add documentation in cryptodevs.rst?
> The cryptodev library now registers commands with telemetry, and
> implements the corresponding callback functions. These commands
> allow a list of cryptodevs and stats for a cryptodev to be
> queried.
>
> An example usage can be seen below:
>
> Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
> {"version": "DPDK 21.11.0-rc0", "pid": 1135019, "max_output_len": 16384}
> --> /
> {"/": ["/", "/cryptodev/list", "/cryptodev/stats", ...]}
> --> /cryptodev/list
> {"/cryptodev/list": {"0000:1a:01.0_qat_sym": 0, "0000:1a:01.0_qat_asym": \
> 1}}
> --> /cryptodev/stats,0
> {"/cryptodev/stats": {"enqueued_count": 0, "dequeued_count": 0, \
> "enqueue_err_count": 0, "dequeue_err_count": 0}}
>
> Signed-off-by: Rebecca Troy <rebecca.troy@intel.com>
> ---
> lib/cryptodev/rte_cryptodev.c | 62
> +++++++++++++++++++++++++++++++++++
Release notes also missing.
> An example usage can be seen below: > > Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2 > {"version": "DPDK 21.11.0-rc0", "pid": 1135019, "max_output_len": 16384} > --> / > {"/": ["/", "/cryptodev/list", "/cryptodev/stats", ...]} > --> /cryptodev/list > {"/cryptodev/list": {"0000:1a:01.0_qat_sym": 0, "0000:1a:01.0_qat_asym": \ > 1}} Will this be better if we list keys by port ID, as port ID is used as param in appropriate endpoints ? Just a suggestion. > --> /cryptodev/stats,0 > {"/cryptodev/stats": {"enqueued_count": 0, "dequeued_count": 0, \ > "enqueue_err_count": 0, "dequeue_err_count": 0}} > > Signed-off-by: Rebecca Troy <rebecca.troy@intel.com> > --- > lib/cryptodev/rte_cryptodev.c | 62 +++++++++++++++++++++++++++++++++++ > 1 file changed, 62 insertions(+) > > diff --git a/lib/cryptodev/rte_cryptodev.c b/lib/cryptodev/rte_cryptodev.c index > 447aa9d519..1e3ab633cc 100644 > --- a/lib/cryptodev/rte_cryptodev.c > +++ b/lib/cryptodev/rte_cryptodev.c > @@ -36,6 +36,7 @@ > #include <rte_errno.h> > #include <rte_spinlock.h> > #include <rte_string_fns.h> > +#include <rte_telemetry.h> > > #include "rte_crypto.h" > #include "rte_cryptodev.h" > @@ -2427,3 +2428,64 @@ rte_cryptodev_allocate_driver(struct > cryptodev_driver *crypto_drv, > > return nb_drivers++; > } > + > +static int > +cryptodev_handle_dev_list(const char *cmd __rte_unused, > + const char *params __rte_unused, > + struct rte_tel_data *d) > +{ > + int dev_id; > + > + if (rte_cryptodev_count() < 1) > + return -1; > + > + rte_tel_data_start_dict(d); > + for (dev_id = 0; dev_id < RTE_CRYPTO_MAX_DEVS; dev_id++) > + if (rte_cryptodev_pmd_is_valid_dev(dev_id)) This is broken now. Correct function is rte_cryptodev_is_valid_dev() . Thanks, Gowrishankar
On Wed, Sep 29, 2021 at 05:14:38AM +0000, Gowrishankar Muthukrishnan wrote:
> > An example usage can be seen below:
> >
> > Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
> > {"version": "DPDK 21.11.0-rc0", "pid": 1135019, "max_output_len": 16384}
> > --> /
> > {"/": ["/", "/cryptodev/list", "/cryptodev/stats", ...]}
> > --> /cryptodev/list
> > {"/cryptodev/list": {"0000:1a:01.0_qat_sym": 0, "0000:1a:01.0_qat_asym": \
> > 1}}
>
> Will this be better if we list keys by port ID, as port ID is used as param in appropriate endpoints ?
> Just a suggestion.
>
+1 to that suggestion
The cryptodev library now registers commands with telemetry, and implements the corresponding callback functions. These commands allow a list of cryptodevs to be queried, as well as info and stats for the corresponding cryptodev. An example usage can be seen below: Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2 {"version": "DPDK 21.11.0-rc0", "pid": 1135019, "max_output_len": 16384} --> / {"/": ["/", "/cryptodev/info", "/cryptodev/list", "/cryptodev/stats", ...]} --> /cryptodev/list {"/cryptodev/list": [0,1,2,3]} --> /cryptodev/info,0 {"/cryptodev/info": {"device_name": "0000:1c:01.0_qat_sym", \ "max_nb_queue_pairs": 2}} --> /cryptodev/stats,0 {"/cryptodev/stats": {"enqueued_count": 0, "dequeued_count": 0, \ "enqueue_err_count": 0, "dequeue_err_count": 0}} Signed-off-by: Rebecca Troy <rebecca.troy@intel.com> --- v2: - Added documentation and release notes. - Changed the /cryptodev/list command to list the devices as an array of IDs, rather than as names and IDs. - Added the /cryptodev/info command as described above. --- doc/guides/prog_guide/cryptodev_lib.rst | 30 ++++++++ doc/guides/rel_notes/release_21_11.rst | 5 ++ lib/cryptodev/rte_cryptodev.c | 92 +++++++++++++++++++++++++ 3 files changed, 127 insertions(+) diff --git a/doc/guides/prog_guide/cryptodev_lib.rst b/doc/guides/prog_guide/cryptodev_lib.rst index 9b1cf8d49f..b94d3caa60 100644 --- a/doc/guides/prog_guide/cryptodev_lib.rst +++ b/doc/guides/prog_guide/cryptodev_lib.rst @@ -1282,3 +1282,33 @@ Asymmetric Crypto Device API The cryptodev Library API is described in the `DPDK API Reference <https://doc.dpdk.org/api/>`_ + + +Device Statistics +~~~~~~~~~~~~~~~~~ + +The Cryptodev library has support for displaying cryptodev information +through the Telemetry interface. Telemetry commands that can be used +are shown below. + +#. Get the list of available Crypto devices by ID:: + + --> /cryptodev/list + {"/cryptodev/list": [0, 1, 2, 3]} + +#. Get general information from a Crypto device:: + + --> /cryptodev/info,0 + {"/cryptodev/info": {"device_name": "0000:1c:01.0_qat_sym", + "max_nb_queue_pairs": 2}} + +#. Get the statistics for a particular Crypto device:: + + --> /cryptodev/stats,0 + {"/cryptodev/stats": {"enqueued_count": 0, + "dequeued_count": 0, "enqueue_err_count": 0, + "dequeue_err_count": 0}} + + +For more information on how to use the Telemetry interface, see +the :doc:../howto/telemetry. diff --git a/doc/guides/rel_notes/release_21_11.rst b/doc/guides/rel_notes/release_21_11.rst index dfc2cbdeed..762c6f050a 100644 --- a/doc/guides/rel_notes/release_21_11.rst +++ b/doc/guides/rel_notes/release_21_11.rst @@ -110,6 +110,11 @@ New Features * Added PDCP short MAC-I support. +* **Added Telemetry callbacks to Cryptodev library.** + + Added Telemetry callback functions which allow a list of Crypto devices, + stats for a Crypto device, and other device information to be queried. + * **Added multi-process support for testpmd.** Added command-line options to specify total number of processes and diff --git a/lib/cryptodev/rte_cryptodev.c b/lib/cryptodev/rte_cryptodev.c index 9fa3aff1d3..d8199b7253 100644 --- a/lib/cryptodev/rte_cryptodev.c +++ b/lib/cryptodev/rte_cryptodev.c @@ -36,6 +36,7 @@ #include <rte_errno.h> #include <rte_spinlock.h> #include <rte_string_fns.h> +#include <rte_telemetry.h> #include "rte_crypto.h" #include "rte_cryptodev.h" @@ -2427,3 +2428,94 @@ rte_cryptodev_allocate_driver(struct cryptodev_driver *crypto_drv, return nb_drivers++; } + +static int +cryptodev_handle_dev_list(const char *cmd __rte_unused, + const char *params __rte_unused, + struct rte_tel_data *d) +{ + int dev_id; + + if (rte_cryptodev_count() < 1) + return -1; + + rte_tel_data_start_array(d, RTE_TEL_INT_VAL); + for (dev_id = 0; dev_id < RTE_CRYPTO_MAX_DEVS; dev_id++) + if (rte_cryptodev_is_valid_dev(dev_id)) + rte_tel_data_add_array_int(d, dev_id); + + return 0; +} + +static int +cryptodev_handle_dev_info(const char *cmd __rte_unused, + const char *params, struct rte_tel_data *d) +{ + struct rte_cryptodev_info cryptodev_info; + int dev_id; + char *end_param; + + if (params == NULL || strlen(params) == 0 || !isdigit(*params)) + return -EINVAL; + + dev_id = strtoul(params, &end_param, 0); + if (*end_param != '\0') + CDEV_LOG_ERR("Extra parameters passed to command, ignoring"); + if (!rte_cryptodev_is_valid_dev(dev_id)) + return -1; + + rte_cryptodev_info_get(dev_id, &cryptodev_info); + + rte_tel_data_start_dict(d); + rte_tel_data_add_dict_string(d, "device_name", + cryptodev_info.device->name); + rte_tel_data_add_dict_int(d, "max_nb_queue_pairs", + cryptodev_info.max_nb_queue_pairs); + + return 0; +} + +#define ADD_DICT_STAT(s) rte_tel_data_add_dict_u64(d, #s, cryptodev_stats.s) + +static int +cryptodev_handle_dev_stats(const char *cmd __rte_unused, + const char *params, + struct rte_tel_data *d) +{ + struct rte_cryptodev_stats cryptodev_stats; + 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') + CDEV_LOG_ERR("Extra parameters passed to command, ignoring"); + if (!rte_cryptodev_is_valid_dev(dev_id)) + return -1; + + ret = rte_cryptodev_stats_get(dev_id, &cryptodev_stats); + if (ret < 0) + return ret; + + rte_tel_data_start_dict(d); + ADD_DICT_STAT(enqueued_count); + ADD_DICT_STAT(dequeued_count); + ADD_DICT_STAT(enqueue_err_count); + ADD_DICT_STAT(dequeue_err_count); + + return 0; +} + +RTE_INIT(cryptodev_init_telemetry) +{ + rte_telemetry_register_cmd("/cryptodev/info", cryptodev_handle_dev_info, + "Returns information for a cryptodev. Parameters: int dev_id"); + rte_telemetry_register_cmd("/cryptodev/list", + cryptodev_handle_dev_list, + "Returns list of available crypto devices by IDs. No parameters."); + rte_telemetry_register_cmd("/cryptodev/stats", + cryptodev_handle_dev_stats, + "Returns the stats for a cryptodev. Parameters: int dev_id"); +} -- 2.25.1
The cryptodev library now registers commands with telemetry, and implements the corresponding callback functions. These commands allow a list of cryptodevs to be queried, as well as info and stats for the corresponding cryptodev. An example usage can be seen below: Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2 {"version": "DPDK 21.11.0-rc0", "pid": 1135019, "max_output_len": 16384} --> / {"/": ["/", "/cryptodev/info", "/cryptodev/list", "/cryptodev/stats", ...]} --> /cryptodev/list {"/cryptodev/list": [0,1,2,3]} --> /cryptodev/info,0 {"/cryptodev/info": {"device_name": "0000:1c:01.0_qat_sym", \ "max_nb_queue_pairs": 2}} --> /cryptodev/stats,0 {"/cryptodev/stats": {"enqueued_count": 0, "dequeued_count": 0, \ "enqueue_err_count": 0, "dequeue_err_count": 0}} Signed-off-by: Rebecca Troy <rebecca.troy@intel.com> --- v3: - Added missing version tag to patch. v2: - Added documentation and release notes. - Changed the /cryptodev/list command to list the devices as an array of IDs, rather than as names and IDs. - Added the /cryptodev/info command as described above. --- --- doc/guides/prog_guide/cryptodev_lib.rst | 30 ++++++++ doc/guides/rel_notes/release_21_11.rst | 5 ++ lib/cryptodev/rte_cryptodev.c | 92 +++++++++++++++++++++++++ 3 files changed, 127 insertions(+) diff --git a/doc/guides/prog_guide/cryptodev_lib.rst b/doc/guides/prog_guide/cryptodev_lib.rst index 9b1cf8d49f..b94d3caa60 100644 --- a/doc/guides/prog_guide/cryptodev_lib.rst +++ b/doc/guides/prog_guide/cryptodev_lib.rst @@ -1282,3 +1282,33 @@ Asymmetric Crypto Device API The cryptodev Library API is described in the `DPDK API Reference <https://doc.dpdk.org/api/>`_ + + +Device Statistics +~~~~~~~~~~~~~~~~~ + +The Cryptodev library has support for displaying cryptodev information +through the Telemetry interface. Telemetry commands that can be used +are shown below. + +#. Get the list of available Crypto devices by ID:: + + --> /cryptodev/list + {"/cryptodev/list": [0, 1, 2, 3]} + +#. Get general information from a Crypto device:: + + --> /cryptodev/info,0 + {"/cryptodev/info": {"device_name": "0000:1c:01.0_qat_sym", + "max_nb_queue_pairs": 2}} + +#. Get the statistics for a particular Crypto device:: + + --> /cryptodev/stats,0 + {"/cryptodev/stats": {"enqueued_count": 0, + "dequeued_count": 0, "enqueue_err_count": 0, + "dequeue_err_count": 0}} + + +For more information on how to use the Telemetry interface, see +the :doc:../howto/telemetry. diff --git a/doc/guides/rel_notes/release_21_11.rst b/doc/guides/rel_notes/release_21_11.rst index efeffe37a0..487a9b0c73 100644 --- a/doc/guides/rel_notes/release_21_11.rst +++ b/doc/guides/rel_notes/release_21_11.rst @@ -114,6 +114,11 @@ New Features * Added PDCP short MAC-I support. +* **Added Telemetry callbacks to Cryptodev library.** + + Added Telemetry callback functions which allow a list of Crypto devices, + stats for a Crypto device, and other device information to be queried. + * **Added multi-process support for testpmd.** Added command-line options to specify total number of processes and diff --git a/lib/cryptodev/rte_cryptodev.c b/lib/cryptodev/rte_cryptodev.c index b913c434c5..78394c1c65 100644 --- a/lib/cryptodev/rte_cryptodev.c +++ b/lib/cryptodev/rte_cryptodev.c @@ -35,6 +35,7 @@ #include <rte_errno.h> #include <rte_spinlock.h> #include <rte_string_fns.h> +#include <rte_telemetry.h> #include "rte_crypto.h" #include "rte_cryptodev.h" @@ -2426,3 +2427,94 @@ rte_cryptodev_allocate_driver(struct cryptodev_driver *crypto_drv, return nb_drivers++; } + +static int +cryptodev_handle_dev_list(const char *cmd __rte_unused, + const char *params __rte_unused, + struct rte_tel_data *d) +{ + int dev_id; + + if (rte_cryptodev_count() < 1) + return -1; + + rte_tel_data_start_array(d, RTE_TEL_INT_VAL); + for (dev_id = 0; dev_id < RTE_CRYPTO_MAX_DEVS; dev_id++) + if (rte_cryptodev_is_valid_dev(dev_id)) + rte_tel_data_add_array_int(d, dev_id); + + return 0; +} + +static int +cryptodev_handle_dev_info(const char *cmd __rte_unused, + const char *params, struct rte_tel_data *d) +{ + struct rte_cryptodev_info cryptodev_info; + int dev_id; + char *end_param; + + if (params == NULL || strlen(params) == 0 || !isdigit(*params)) + return -EINVAL; + + dev_id = strtoul(params, &end_param, 0); + if (*end_param != '\0') + CDEV_LOG_ERR("Extra parameters passed to command, ignoring"); + if (!rte_cryptodev_is_valid_dev(dev_id)) + return -1; + + rte_cryptodev_info_get(dev_id, &cryptodev_info); + + rte_tel_data_start_dict(d); + rte_tel_data_add_dict_string(d, "device_name", + cryptodev_info.device->name); + rte_tel_data_add_dict_int(d, "max_nb_queue_pairs", + cryptodev_info.max_nb_queue_pairs); + + return 0; +} + +#define ADD_DICT_STAT(s) rte_tel_data_add_dict_u64(d, #s, cryptodev_stats.s) + +static int +cryptodev_handle_dev_stats(const char *cmd __rte_unused, + const char *params, + struct rte_tel_data *d) +{ + struct rte_cryptodev_stats cryptodev_stats; + 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') + CDEV_LOG_ERR("Extra parameters passed to command, ignoring"); + if (!rte_cryptodev_is_valid_dev(dev_id)) + return -1; + + ret = rte_cryptodev_stats_get(dev_id, &cryptodev_stats); + if (ret < 0) + return ret; + + rte_tel_data_start_dict(d); + ADD_DICT_STAT(enqueued_count); + ADD_DICT_STAT(dequeued_count); + ADD_DICT_STAT(enqueue_err_count); + ADD_DICT_STAT(dequeue_err_count); + + return 0; +} + +RTE_INIT(cryptodev_init_telemetry) +{ + rte_telemetry_register_cmd("/cryptodev/info", cryptodev_handle_dev_info, + "Returns information for a cryptodev. Parameters: int dev_id"); + rte_telemetry_register_cmd("/cryptodev/list", + cryptodev_handle_dev_list, + "Returns list of available crypto devices by IDs. No parameters."); + rte_telemetry_register_cmd("/cryptodev/stats", + cryptodev_handle_dev_stats, + "Returns the stats for a cryptodev. Parameters: int dev_id"); +} -- 2.25.1
Hi Becky, >-----Original Message----- >From: Troy, Rebecca <rebecca.troy@intel.com> >Sent: Thursday 7 October 2021 15:11 >To: dev@dpdk.org >Cc: Power, Ciara <ciara.power@intel.com>; Zhang, Roy Fan ><roy.fan.zhang@intel.com>; Troy, Rebecca <rebecca.troy@intel.com>; Akhil >Goyal <gakhil@marvell.com>; Doherty, Declan <declan.doherty@intel.com> >Subject: [PATCH v3] cryptodev: add telemetry callbacks > >The cryptodev library now registers commands with telemetry, and >implements the corresponding callback functions. These commands allow a >list of cryptodevs to be queried, as well as info and stats for the corresponding >cryptodev. > >An example usage can be seen below: > >Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2 >{"version": "DPDK 21.11.0-rc0", "pid": 1135019, "max_output_len": 16384} >--> / >{"/": ["/", "/cryptodev/info", "/cryptodev/list", "/cryptodev/stats", ...]} >--> /cryptodev/list >{"/cryptodev/list": [0,1,2,3]} >--> /cryptodev/info,0 >{"/cryptodev/info": {"device_name": "0000:1c:01.0_qat_sym", \ > "max_nb_queue_pairs": 2}} >--> /cryptodev/stats,0 >{"/cryptodev/stats": {"enqueued_count": 0, "dequeued_count": 0, \ > "enqueue_err_count": 0, "dequeue_err_count": 0}} > >Signed-off-by: Rebecca Troy <rebecca.troy@intel.com> > >--- >v3: > - Added missing version tag to patch. >v2: > - Added documentation and release notes. > - Changed the /cryptodev/list command to list the devices as an > array of IDs, rather than as names and IDs. > - Added the /cryptodev/info command as described above. >--- >--- > doc/guides/prog_guide/cryptodev_lib.rst | 30 ++++++++ >doc/guides/rel_notes/release_21_11.rst | 5 ++ > lib/cryptodev/rte_cryptodev.c | 92 +++++++++++++++++++++++++ > 3 files changed, 127 insertions(+) > >diff --git a/doc/guides/prog_guide/cryptodev_lib.rst >b/doc/guides/prog_guide/cryptodev_lib.rst >index 9b1cf8d49f..b94d3caa60 100644 >--- a/doc/guides/prog_guide/cryptodev_lib.rst >+++ b/doc/guides/prog_guide/cryptodev_lib.rst >@@ -1282,3 +1282,33 @@ Asymmetric Crypto Device API > > The cryptodev Library API is described in the `DPDK API Reference ><https://doc.dpdk.org/api/>`_ >+ >+ >+Device Statistics >+~~~~~~~~~~~~~~~~~ This header underline (~~~) means this section will be a subsection of "Asymmetric crypto Sample code", which isn't correct. I suggest changing the underline to "----" to move it up a level to be its own section. >+ >+The Cryptodev library has support for displaying cryptodev information >+through the Telemetry interface. Telemetry commands that can be used >+are shown below. >+ >+#. Get the list of available Crypto devices by ID:: >+ >+ --> /cryptodev/list >+ {"/cryptodev/list": [0, 1, 2, 3]} >+ >+#. Get general information from a Crypto device:: >+ >+ --> /cryptodev/info,0 >+ {"/cryptodev/info": {"device_name": "0000:1c:01.0_qat_sym", >+ "max_nb_queue_pairs": 2}} >+ >+#. Get the statistics for a particular Crypto device:: >+ >+ --> /cryptodev/stats,0 >+ {"/cryptodev/stats": {"enqueued_count": 0, >+ "dequeued_count": 0, "enqueue_err_count": 0, >+ "dequeue_err_count": 0}} >+ >+ >+For more information on how to use the Telemetry interface, see the >+:doc:../howto/telemetry. There are ` symbols missing here, so this link doesn't work. Needs to be: :doc:`../howto/telemetry` <snip> >+static int >+cryptodev_handle_dev_info(const char *cmd __rte_unused, >+ const char *params, struct rte_tel_data *d) { >+ struct rte_cryptodev_info cryptodev_info; >+ int dev_id; >+ char *end_param; >+ >+ if (params == NULL || strlen(params) == 0 || !isdigit(*params)) >+ return -EINVAL; >+ >+ dev_id = strtoul(params, &end_param, 0); >+ if (*end_param != '\0') >+ CDEV_LOG_ERR("Extra parameters passed to command, >ignoring"); >+ if (!rte_cryptodev_is_valid_dev(dev_id)) >+ return -1; Maybe -EINVAL return value would be better here, same comment for handle_dev_stats function. <snip> Thanks, Ciara
The cryptodev library now registers commands with telemetry, and implements the corresponding callback functions. These commands allow a list of cryptodevs to be queried, as well as info and stats for the corresponding cryptodev. An example usage can be seen below: Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2 {"version": "DPDK 21.11.0-rc0", "pid": 1135019, "max_output_len": 16384} --> / {"/": ["/", "/cryptodev/info", "/cryptodev/list", "/cryptodev/stats", ...]} --> /cryptodev/list {"/cryptodev/list": [0,1,2,3]} --> /cryptodev/info,0 {"/cryptodev/info": {"device_name": "0000:1c:01.0_qat_sym", \ "max_nb_queue_pairs": 2}} --> /cryptodev/stats,0 {"/cryptodev/stats": {"enqueued_count": 0, "dequeued_count": 0, \ "enqueue_err_count": 0, "dequeue_err_count": 0}} Signed-off-by: Rebecca Troy <rebecca.troy@intel.com> --- v4: - Corrected doc heading underline and link - Replaced remaining -1 return values with -EINVAL v3: - Added missing version tag to patch. v2: - Added documentation and release notes. - Changed the /cryptodev/list command to list the devices as an array of IDs, rather than as names and IDs. - Added the /cryptodev/info command as described above. --- doc/guides/prog_guide/cryptodev_lib.rst | 28 ++++++++ doc/guides/rel_notes/release_21_11.rst | 5 ++ lib/cryptodev/rte_cryptodev.c | 92 +++++++++++++++++++++++++ 3 files changed, 125 insertions(+) diff --git a/doc/guides/prog_guide/cryptodev_lib.rst b/doc/guides/prog_guide/cryptodev_lib.rst index 9b1cf8d49f..25663e552e 100644 --- a/doc/guides/prog_guide/cryptodev_lib.rst +++ b/doc/guides/prog_guide/cryptodev_lib.rst @@ -1282,3 +1282,31 @@ Asymmetric Crypto Device API The cryptodev Library API is described in the `DPDK API Reference <https://doc.dpdk.org/api/>`_ + + +Device Statistics +----------------- + +The Cryptodev library has support for displaying Crypto device information +through the Telemetry interface. Telemetry commands that can be used +are shown below. + +#. Get the list of available Crypto devices by ID:: + + --> /cryptodev/list + {"/cryptodev/list": [0, 1, 2, 3]} + +#. Get general information from a Crypto device:: + + --> /cryptodev/info,0 + {"/cryptodev/info": {"device_name": "0000:1c:01.0_qat_sym", + "max_nb_queue_pairs": 2}} + +#. Get the statistics for a particular Crypto device:: + + --> /cryptodev/stats,0 + {"/cryptodev/stats": {"enqueued_count": 0, "dequeued_count": 0, + "enqueue_err_count": 0, "dequeue_err_count": 0}} + +For more information on how to use the Telemetry interface, see +the :doc:`../howto/telemetry`. diff --git a/doc/guides/rel_notes/release_21_11.rst b/doc/guides/rel_notes/release_21_11.rst index f643a61f44..f3242acb15 100644 --- a/doc/guides/rel_notes/release_21_11.rst +++ b/doc/guides/rel_notes/release_21_11.rst @@ -137,6 +137,11 @@ New Features Added support for more comprehensive CRC options. +* **Added Telemetry callbacks to Cryptodev library.** + + Added Telemetry callback functions which allow a list of Crypto devices, + stats for a Crypto device, and other device information to be queried. + * **Added multi-process support for testpmd.** Added command-line options to specify total number of processes and diff --git a/lib/cryptodev/rte_cryptodev.c b/lib/cryptodev/rte_cryptodev.c index b913c434c5..52066a953b 100644 --- a/lib/cryptodev/rte_cryptodev.c +++ b/lib/cryptodev/rte_cryptodev.c @@ -35,6 +35,7 @@ #include <rte_errno.h> #include <rte_spinlock.h> #include <rte_string_fns.h> +#include <rte_telemetry.h> #include "rte_crypto.h" #include "rte_cryptodev.h" @@ -2426,3 +2427,94 @@ rte_cryptodev_allocate_driver(struct cryptodev_driver *crypto_drv, return nb_drivers++; } + +static int +cryptodev_handle_dev_list(const char *cmd __rte_unused, + const char *params __rte_unused, + struct rte_tel_data *d) +{ + int dev_id; + + if (rte_cryptodev_count() < 1) + return -1; + + rte_tel_data_start_array(d, RTE_TEL_INT_VAL); + for (dev_id = 0; dev_id < RTE_CRYPTO_MAX_DEVS; dev_id++) + if (rte_cryptodev_is_valid_dev(dev_id)) + rte_tel_data_add_array_int(d, dev_id); + + return 0; +} + +static int +cryptodev_handle_dev_info(const char *cmd __rte_unused, + const char *params, struct rte_tel_data *d) +{ + struct rte_cryptodev_info cryptodev_info; + int dev_id; + char *end_param; + + if (params == NULL || strlen(params) == 0 || !isdigit(*params)) + return -EINVAL; + + dev_id = strtoul(params, &end_param, 0); + if (*end_param != '\0') + CDEV_LOG_ERR("Extra parameters passed to command, ignoring"); + if (!rte_cryptodev_is_valid_dev(dev_id)) + return -EINVAL; + + rte_cryptodev_info_get(dev_id, &cryptodev_info); + + rte_tel_data_start_dict(d); + rte_tel_data_add_dict_string(d, "device_name", + cryptodev_info.device->name); + rte_tel_data_add_dict_int(d, "max_nb_queue_pairs", + cryptodev_info.max_nb_queue_pairs); + + return 0; +} + +#define ADD_DICT_STAT(s) rte_tel_data_add_dict_u64(d, #s, cryptodev_stats.s) + +static int +cryptodev_handle_dev_stats(const char *cmd __rte_unused, + const char *params, + struct rte_tel_data *d) +{ + struct rte_cryptodev_stats cryptodev_stats; + 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') + CDEV_LOG_ERR("Extra parameters passed to command, ignoring"); + if (!rte_cryptodev_is_valid_dev(dev_id)) + return -EINVAL; + + ret = rte_cryptodev_stats_get(dev_id, &cryptodev_stats); + if (ret < 0) + return ret; + + rte_tel_data_start_dict(d); + ADD_DICT_STAT(enqueued_count); + ADD_DICT_STAT(dequeued_count); + ADD_DICT_STAT(enqueue_err_count); + ADD_DICT_STAT(dequeue_err_count); + + return 0; +} + +RTE_INIT(cryptodev_init_telemetry) +{ + rte_telemetry_register_cmd("/cryptodev/info", cryptodev_handle_dev_info, + "Returns information for a cryptodev. Parameters: int dev_id"); + rte_telemetry_register_cmd("/cryptodev/list", + cryptodev_handle_dev_list, + "Returns list of available crypto devices by IDs. No parameters."); + rte_telemetry_register_cmd("/cryptodev/stats", + cryptodev_handle_dev_stats, + "Returns the stats for a cryptodev. Parameters: int dev_id"); +} -- 2.25.1
>-----Original Message-----
>From: Troy, Rebecca <rebecca.troy@intel.com>
>Sent: Wednesday 13 October 2021 11:22
>To: dev@dpdk.org
>Cc: Power, Ciara <ciara.power@intel.com>; Zhang, Roy Fan
><roy.fan.zhang@intel.com>; Troy, Rebecca <rebecca.troy@intel.com>; Akhil
>Goyal <gakhil@marvell.com>; Doherty, Declan <declan.doherty@intel.com>
>Subject: [PATCH v4] cryptodev: add telemetry callbacks
>
>The cryptodev library now registers commands with telemetry, and
>implements the corresponding callback functions. These commands allow a
>list of cryptodevs to be queried, as well as info and stats for the corresponding
>cryptodev.
>
>An example usage can be seen below:
>
>Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
>{"version": "DPDK 21.11.0-rc0", "pid": 1135019, "max_output_len": 16384}
>--> /
>{"/": ["/", "/cryptodev/info", "/cryptodev/list", "/cryptodev/stats", ...]}
>--> /cryptodev/list
>{"/cryptodev/list": [0,1,2,3]}
>--> /cryptodev/info,0
>{"/cryptodev/info": {"device_name": "0000:1c:01.0_qat_sym", \
> "max_nb_queue_pairs": 2}}
>--> /cryptodev/stats,0
>{"/cryptodev/stats": {"enqueued_count": 0, "dequeued_count": 0, \
> "enqueue_err_count": 0, "dequeue_err_count": 0}}
>
>Signed-off-by: Rebecca Troy <rebecca.troy@intel.com>
<snip>
Acked-by: Ciara Power <ciara.power@intel.com>
> Subject: [dpdk-dev] [PATCH v4] cryptodev: add telemetry callbacks
>
> External email: Use caution opening links or attachments
>
>
> The cryptodev library now registers commands with telemetry, and
> implements the corresponding callback functions. These commands allow a
> list of cryptodevs to be queried, as well as info and stats for the
> corresponding cryptodev.
>
The build of this patch fails on Windows with the following error:
../lib/cryptodev/rte_cryptodev.c:38:10: fatal error: rte_telemetry.h: No such file or directory
#include <rte_telemetry.h>
To resolve it you need to add telemetry to the list of deps in cryptodev's meson.build file.
The cryptodev library now registers commands with telemetry, and implements the corresponding callback functions. These commands allow a list of cryptodevs to be queried, as well as info and stats for the corresponding cryptodev. An example usage can be seen below: Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2 {"version": "DPDK 21.11.0-rc0", "pid": 1135019, "max_output_len": 16384} --> / {"/": ["/", "/cryptodev/info", "/cryptodev/list", "/cryptodev/stats", ...]} --> /cryptodev/list {"/cryptodev/list": [0,1,2,3]} --> /cryptodev/info,0 {"/cryptodev/info": {"device_name": "0000:1c:01.0_qat_sym", \ "max_nb_queue_pairs": 2}} --> /cryptodev/stats,0 {"/cryptodev/stats": {"enqueued_count": 0, "dequeued_count": 0, \ "enqueue_err_count": 0, "dequeue_err_count": 0}} Signed-off-by: Rebecca Troy <rebecca.troy@intel.com> Acked-by: Ciara Power <ciara.power@intel.com> --- v5: - Added missing telemetry dependency to meson.build. v4: - Corrected doc heading underline and link. - Replaced remaining -1 return values with -EINVAL. v3: - Added missing version tag to patch. v2: - Added documentation and release notes. - Changed the /cryptodev/list command to list the devices as an array of IDs, rather than as names and IDs. - Added the /cryptodev/info command as described above. --- doc/guides/prog_guide/cryptodev_lib.rst | 28 ++++++++ doc/guides/rel_notes/release_21_11.rst | 5 ++ lib/cryptodev/meson.build | 2 +- lib/cryptodev/rte_cryptodev.c | 92 +++++++++++++++++++++++++ 4 files changed, 126 insertions(+), 1 deletion(-) diff --git a/doc/guides/prog_guide/cryptodev_lib.rst b/doc/guides/prog_guide/cryptodev_lib.rst index 9b1cf8d49f..25663e552e 100644 --- a/doc/guides/prog_guide/cryptodev_lib.rst +++ b/doc/guides/prog_guide/cryptodev_lib.rst @@ -1282,3 +1282,31 @@ Asymmetric Crypto Device API The cryptodev Library API is described in the `DPDK API Reference <https://doc.dpdk.org/api/>`_ + + +Device Statistics +----------------- + +The Cryptodev library has support for displaying Crypto device information +through the Telemetry interface. Telemetry commands that can be used +are shown below. + +#. Get the list of available Crypto devices by ID:: + + --> /cryptodev/list + {"/cryptodev/list": [0, 1, 2, 3]} + +#. Get general information from a Crypto device:: + + --> /cryptodev/info,0 + {"/cryptodev/info": {"device_name": "0000:1c:01.0_qat_sym", + "max_nb_queue_pairs": 2}} + +#. Get the statistics for a particular Crypto device:: + + --> /cryptodev/stats,0 + {"/cryptodev/stats": {"enqueued_count": 0, "dequeued_count": 0, + "enqueue_err_count": 0, "dequeue_err_count": 0}} + +For more information on how to use the Telemetry interface, see +the :doc:`../howto/telemetry`. diff --git a/doc/guides/rel_notes/release_21_11.rst b/doc/guides/rel_notes/release_21_11.rst index f643a61f44..f3242acb15 100644 --- a/doc/guides/rel_notes/release_21_11.rst +++ b/doc/guides/rel_notes/release_21_11.rst @@ -137,6 +137,11 @@ New Features Added support for more comprehensive CRC options. +* **Added Telemetry callbacks to Cryptodev library.** + + Added Telemetry callback functions which allow a list of Crypto devices, + stats for a Crypto device, and other device information to be queried. + * **Added multi-process support for testpmd.** Added command-line options to specify total number of processes and diff --git a/lib/cryptodev/meson.build b/lib/cryptodev/meson.build index 51371c3aa2..7d8c7fdd62 100644 --- a/lib/cryptodev/meson.build +++ b/lib/cryptodev/meson.build @@ -19,4 +19,4 @@ driver_sdk_headers += files( 'cryptodev_pmd.h', ) -deps += ['kvargs', 'mbuf', 'rcu'] +deps += ['kvargs', 'mbuf', 'rcu', 'telemetry'] diff --git a/lib/cryptodev/rte_cryptodev.c b/lib/cryptodev/rte_cryptodev.c index b913c434c5..52066a953b 100644 --- a/lib/cryptodev/rte_cryptodev.c +++ b/lib/cryptodev/rte_cryptodev.c @@ -35,6 +35,7 @@ #include <rte_errno.h> #include <rte_spinlock.h> #include <rte_string_fns.h> +#include <rte_telemetry.h> #include "rte_crypto.h" #include "rte_cryptodev.h" @@ -2426,3 +2427,94 @@ rte_cryptodev_allocate_driver(struct cryptodev_driver *crypto_drv, return nb_drivers++; } + +static int +cryptodev_handle_dev_list(const char *cmd __rte_unused, + const char *params __rte_unused, + struct rte_tel_data *d) +{ + int dev_id; + + if (rte_cryptodev_count() < 1) + return -1; + + rte_tel_data_start_array(d, RTE_TEL_INT_VAL); + for (dev_id = 0; dev_id < RTE_CRYPTO_MAX_DEVS; dev_id++) + if (rte_cryptodev_is_valid_dev(dev_id)) + rte_tel_data_add_array_int(d, dev_id); + + return 0; +} + +static int +cryptodev_handle_dev_info(const char *cmd __rte_unused, + const char *params, struct rte_tel_data *d) +{ + struct rte_cryptodev_info cryptodev_info; + int dev_id; + char *end_param; + + if (params == NULL || strlen(params) == 0 || !isdigit(*params)) + return -EINVAL; + + dev_id = strtoul(params, &end_param, 0); + if (*end_param != '\0') + CDEV_LOG_ERR("Extra parameters passed to command, ignoring"); + if (!rte_cryptodev_is_valid_dev(dev_id)) + return -EINVAL; + + rte_cryptodev_info_get(dev_id, &cryptodev_info); + + rte_tel_data_start_dict(d); + rte_tel_data_add_dict_string(d, "device_name", + cryptodev_info.device->name); + rte_tel_data_add_dict_int(d, "max_nb_queue_pairs", + cryptodev_info.max_nb_queue_pairs); + + return 0; +} + +#define ADD_DICT_STAT(s) rte_tel_data_add_dict_u64(d, #s, cryptodev_stats.s) + +static int +cryptodev_handle_dev_stats(const char *cmd __rte_unused, + const char *params, + struct rte_tel_data *d) +{ + struct rte_cryptodev_stats cryptodev_stats; + 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') + CDEV_LOG_ERR("Extra parameters passed to command, ignoring"); + if (!rte_cryptodev_is_valid_dev(dev_id)) + return -EINVAL; + + ret = rte_cryptodev_stats_get(dev_id, &cryptodev_stats); + if (ret < 0) + return ret; + + rte_tel_data_start_dict(d); + ADD_DICT_STAT(enqueued_count); + ADD_DICT_STAT(dequeued_count); + ADD_DICT_STAT(enqueue_err_count); + ADD_DICT_STAT(dequeue_err_count); + + return 0; +} + +RTE_INIT(cryptodev_init_telemetry) +{ + rte_telemetry_register_cmd("/cryptodev/info", cryptodev_handle_dev_info, + "Returns information for a cryptodev. Parameters: int dev_id"); + rte_telemetry_register_cmd("/cryptodev/list", + cryptodev_handle_dev_list, + "Returns list of available crypto devices by IDs. No parameters."); + rte_telemetry_register_cmd("/cryptodev/stats", + cryptodev_handle_dev_stats, + "Returns the stats for a cryptodev. Parameters: int dev_id"); +} -- 2.25.1
On Wed, Oct 13, 2021 at 03:22:05PM +0000, Rebecca Troy wrote:
> The cryptodev library now registers commands with telemetry, and
> implements the corresponding callback functions. These commands
> allow a list of cryptodevs to be queried, as well as info and stats
> for the corresponding cryptodev.
>
> An example usage can be seen below:
>
> Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
> {"version": "DPDK 21.11.0-rc0", "pid": 1135019, "max_output_len": 16384}
> --> /
> {"/": ["/", "/cryptodev/info", "/cryptodev/list", "/cryptodev/stats", ...]}
> --> /cryptodev/list
> {"/cryptodev/list": [0,1,2,3]}
> --> /cryptodev/info,0
> {"/cryptodev/info": {"device_name": "0000:1c:01.0_qat_sym", \
> "max_nb_queue_pairs": 2}}
> --> /cryptodev/stats,0
> {"/cryptodev/stats": {"enqueued_count": 0, "dequeued_count": 0, \
> "enqueue_err_count": 0, "dequeue_err_count": 0}}
>
> Signed-off-by: Rebecca Troy <rebecca.troy@intel.com>
> Acked-by: Ciara Power <ciara.power@intel.com>
>
> ---
> v5:
> - Added missing telemetry dependency to meson.build.
Just FYI: This addition is harmless but actually unnecessary, since
telemetry is automatically added as a recursive dependency since EAL uses
the telemetry lib.
Patch LGTM.
/Bruce
> --- > v5: > - Added missing telemetry dependency to meson.build. > v4: > - Corrected doc heading underline and link. > - Replaced remaining -1 return values with -EINVAL. > + > +static int > +cryptodev_handle_dev_list(const char *cmd __rte_unused, > + const char *params __rte_unused, > + struct rte_tel_data *d) > +{ > + int dev_id; > + > + if (rte_cryptodev_count() < 1) > + return -1; EINVAL missed here.
> -----Original Message-----
> From: Akhil Goyal <gakhil@marvell.com>
> Sent: Monday 25 October 2021 05:32
> To: Troy, Rebecca <rebecca.troy@intel.com>; dev@dpdk.org
> Cc: Power, Ciara <ciara.power@intel.com>; Zhang, Roy Fan
> <roy.fan.zhang@intel.com>; Doherty, Declan <declan.doherty@intel.com>
> Subject: RE: [EXT] [PATCH v5] cryptodev: add telemetry callbacks
>
> > ---
> > v5:
> > - Added missing telemetry dependency to meson.build.
> > v4:
> > - Corrected doc heading underline and link.
> > - Replaced remaining -1 return values with -EINVAL.
>
>
> > +
> > +static int
> > +cryptodev_handle_dev_list(const char *cmd __rte_unused,
> > + const char *params __rte_unused,
> > + struct rte_tel_data *d)
> > +{
> > + int dev_id;
> > +
> > + if (rte_cryptodev_count() < 1)
> > + return -1;
>
> EINVAL missed here.
>
Good catch, thanks! Will fix now.
The cryptodev library now registers commands with telemetry, and implements the corresponding callback functions. These commands allow a list of cryptodevs to be queried, as well as info and stats for the corresponding cryptodev. An example usage can be seen below: Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2 {"version": "DPDK 21.11.0-rc0", "pid": 1135019, "max_output_len": 16384} --> / {"/": ["/", "/cryptodev/info", "/cryptodev/list", "/cryptodev/stats", ...]} --> /cryptodev/list {"/cryptodev/list": [0,1,2,3]} --> /cryptodev/info,0 {"/cryptodev/info": {"device_name": "0000:1c:01.0_qat_sym", \ "max_nb_queue_pairs": 2}} --> /cryptodev/stats,0 {"/cryptodev/stats": {"enqueued_count": 0, "dequeued_count": 0, \ "enqueue_err_count": 0, "dequeue_err_count": 0}} Signed-off-by: Rebecca Troy <rebecca.troy@intel.com> Acked-by: Ciara Power <ciara.power@intel.com> --- v6: - Replaced missed -1 return value v5: - Added missing telemetry dependency to meson.build. v4: - Corrected doc heading underline and link. - Replaced remaining -1 return values with -EINVAL. v3: - Added missing version tag to patch. v2: - Added documentation and release notes. - Changed the /cryptodev/list command to list the devices as an array of IDs, rather than as names and IDs. - Added the /cryptodev/info command as described above. --- doc/guides/prog_guide/cryptodev_lib.rst | 28 ++++++++ doc/guides/rel_notes/release_21_11.rst | 5 ++ lib/cryptodev/meson.build | 2 +- lib/cryptodev/rte_cryptodev.c | 92 +++++++++++++++++++++++++ 4 files changed, 126 insertions(+), 1 deletion(-) diff --git a/doc/guides/prog_guide/cryptodev_lib.rst b/doc/guides/prog_guide/cryptodev_lib.rst index 9b1cf8d49f..25663e552e 100644 --- a/doc/guides/prog_guide/cryptodev_lib.rst +++ b/doc/guides/prog_guide/cryptodev_lib.rst @@ -1282,3 +1282,31 @@ Asymmetric Crypto Device API The cryptodev Library API is described in the `DPDK API Reference <https://doc.dpdk.org/api/>`_ + + +Device Statistics +----------------- + +The Cryptodev library has support for displaying Crypto device information +through the Telemetry interface. Telemetry commands that can be used +are shown below. + +#. Get the list of available Crypto devices by ID:: + + --> /cryptodev/list + {"/cryptodev/list": [0, 1, 2, 3]} + +#. Get general information from a Crypto device:: + + --> /cryptodev/info,0 + {"/cryptodev/info": {"device_name": "0000:1c:01.0_qat_sym", + "max_nb_queue_pairs": 2}} + +#. Get the statistics for a particular Crypto device:: + + --> /cryptodev/stats,0 + {"/cryptodev/stats": {"enqueued_count": 0, "dequeued_count": 0, + "enqueue_err_count": 0, "dequeue_err_count": 0}} + +For more information on how to use the Telemetry interface, see +the :doc:`../howto/telemetry`. diff --git a/doc/guides/rel_notes/release_21_11.rst b/doc/guides/rel_notes/release_21_11.rst index 1ccac87b73..ee1e557309 100644 --- a/doc/guides/rel_notes/release_21_11.rst +++ b/doc/guides/rel_notes/release_21_11.rst @@ -269,6 +269,11 @@ New Features * Added support for SA telemetry. * Added support for setting a non default starting ESN value. +* **Added Telemetry callbacks to Cryptodev library.** + + Added Telemetry callback functions which allow a list of Crypto devices, + stats for a Crypto device, and other device information to be queried. + * **Added multi-process support for testpmd.** Added command-line options to specify total number of processes and diff --git a/lib/cryptodev/meson.build b/lib/cryptodev/meson.build index 289b66ab76..19de3073bb 100644 --- a/lib/cryptodev/meson.build +++ b/lib/cryptodev/meson.build @@ -21,4 +21,4 @@ driver_sdk_headers += files( 'cryptodev_pmd.h', ) -deps += ['kvargs', 'mbuf', 'rcu'] +deps += ['kvargs', 'mbuf', 'rcu', 'telemetry'] diff --git a/lib/cryptodev/rte_cryptodev.c b/lib/cryptodev/rte_cryptodev.c index 305e013ebb..3b01a4bfbc 100644 --- a/lib/cryptodev/rte_cryptodev.c +++ b/lib/cryptodev/rte_cryptodev.c @@ -35,6 +35,7 @@ #include <rte_errno.h> #include <rte_spinlock.h> #include <rte_string_fns.h> +#include <rte_telemetry.h> #include "rte_crypto.h" #include "rte_cryptodev.h" @@ -2430,3 +2431,94 @@ RTE_INIT(cryptodev_init_fp_ops) for (i = 0; i != RTE_DIM(rte_crypto_fp_ops); i++) cryptodev_fp_ops_reset(rte_crypto_fp_ops + i); } + +static int +cryptodev_handle_dev_list(const char *cmd __rte_unused, + const char *params __rte_unused, + struct rte_tel_data *d) +{ + int dev_id; + + if (rte_cryptodev_count() < 1) + return -EINVAL; + + rte_tel_data_start_array(d, RTE_TEL_INT_VAL); + for (dev_id = 0; dev_id < RTE_CRYPTO_MAX_DEVS; dev_id++) + if (rte_cryptodev_is_valid_dev(dev_id)) + rte_tel_data_add_array_int(d, dev_id); + + return 0; +} + +static int +cryptodev_handle_dev_info(const char *cmd __rte_unused, + const char *params, struct rte_tel_data *d) +{ + struct rte_cryptodev_info cryptodev_info; + int dev_id; + char *end_param; + + if (params == NULL || strlen(params) == 0 || !isdigit(*params)) + return -EINVAL; + + dev_id = strtoul(params, &end_param, 0); + if (*end_param != '\0') + CDEV_LOG_ERR("Extra parameters passed to command, ignoring"); + if (!rte_cryptodev_is_valid_dev(dev_id)) + return -EINVAL; + + rte_cryptodev_info_get(dev_id, &cryptodev_info); + + rte_tel_data_start_dict(d); + rte_tel_data_add_dict_string(d, "device_name", + cryptodev_info.device->name); + rte_tel_data_add_dict_int(d, "max_nb_queue_pairs", + cryptodev_info.max_nb_queue_pairs); + + return 0; +} + +#define ADD_DICT_STAT(s) rte_tel_data_add_dict_u64(d, #s, cryptodev_stats.s) + +static int +cryptodev_handle_dev_stats(const char *cmd __rte_unused, + const char *params, + struct rte_tel_data *d) +{ + struct rte_cryptodev_stats cryptodev_stats; + 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') + CDEV_LOG_ERR("Extra parameters passed to command, ignoring"); + if (!rte_cryptodev_is_valid_dev(dev_id)) + return -EINVAL; + + ret = rte_cryptodev_stats_get(dev_id, &cryptodev_stats); + if (ret < 0) + return ret; + + rte_tel_data_start_dict(d); + ADD_DICT_STAT(enqueued_count); + ADD_DICT_STAT(dequeued_count); + ADD_DICT_STAT(enqueue_err_count); + ADD_DICT_STAT(dequeue_err_count); + + return 0; +} + +RTE_INIT(cryptodev_init_telemetry) +{ + rte_telemetry_register_cmd("/cryptodev/info", cryptodev_handle_dev_info, + "Returns information for a cryptodev. Parameters: int dev_id"); + rte_telemetry_register_cmd("/cryptodev/list", + cryptodev_handle_dev_list, + "Returns list of available crypto devices by IDs. No parameters."); + rte_telemetry_register_cmd("/cryptodev/stats", + cryptodev_handle_dev_stats, + "Returns the stats for a cryptodev. Parameters: int dev_id"); +} -- 2.25.1
> The cryptodev library now registers commands with telemetry, and
> implements the corresponding callback functions. These commands
> allow a list of cryptodevs to be queried, as well as info and stats
> for the corresponding cryptodev.
>
> An example usage can be seen below:
>
> Connecting to /var/run/dpdk/rte/dpdk_telemetry.v2
> {"version": "DPDK 21.11.0-rc0", "pid": 1135019, "max_output_len": 16384}
> --> /
> {"/": ["/", "/cryptodev/info", "/cryptodev/list", "/cryptodev/stats", ...]}
> --> /cryptodev/list
> {"/cryptodev/list": [0,1,2,3]}
> --> /cryptodev/info,0
> {"/cryptodev/info": {"device_name": "0000:1c:01.0_qat_sym", \
> "max_nb_queue_pairs": 2}}
> --> /cryptodev/stats,0
> {"/cryptodev/stats": {"enqueued_count": 0, "dequeued_count": 0, \
> "enqueue_err_count": 0, "dequeue_err_count": 0}}
>
> Signed-off-by: Rebecca Troy <rebecca.troy@intel.com>
> Acked-by: Ciara Power <ciara.power@intel.com>
>
Acked-by: Akhil Goyal <gakhil@marvell.com>
Applied to dpdk-next-crypto
Thanks.