From: Rebecca Troy Date: Tue, 26 Oct 2021 12:00:45 +0000 (+0000) Subject: cryptodev: support telemetry X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=d3d98f5ce9d050469ec02f1b10cf86e1fb71fe52;p=dpdk.git cryptodev: support telemetry 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 Acked-by: Ciara Power Acked-by: Akhil Goyal --- 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 `_ + + +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 8968a19ae1..9d24577476 100644 --- a/doc/guides/rel_notes/release_21_11.rst +++ b/doc/guides/rel_notes/release_21_11.rst @@ -233,6 +233,11 @@ New Features * Added flow control. * Added IEEE 1588. +* **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. + * **Updated Marvell cnxk crypto PMD.** * Added AES-CBC SHA1-HMAC support in lookaside protocol (IPsec) for CN10K. 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 #include #include +#include #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"); +}