From patchwork Wed Oct 13 15:22:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rebecca Troy X-Patchwork-Id: 101371 X-Patchwork-Delegate: gakhil@marvell.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 878F1A0C55; Wed, 13 Oct 2021 17:22:20 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 77096411EC; Wed, 13 Oct 2021 17:22:20 +0200 (CEST) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by mails.dpdk.org (Postfix) with ESMTP id 99DD74115A for ; Wed, 13 Oct 2021 17:22:18 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10136"; a="214605405" X-IronPort-AV: E=Sophos;i="5.85,371,1624345200"; d="scan'208";a="214605405" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Oct 2021 08:22:17 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.85,371,1624345200"; d="scan'208";a="659574200" Received: from silpixa00400904.ir.intel.com ([10.243.23.83]) by orsmga005.jf.intel.com with ESMTP; 13 Oct 2021 08:22:15 -0700 From: Rebecca Troy To: dev@dpdk.org Cc: ciara.power@intel.com, roy.fan.zhang@intel.com, Rebecca Troy , Akhil Goyal , Declan Doherty Date: Wed, 13 Oct 2021 15:22:05 +0000 Message-Id: <20211013152206.148589-1-rebecca.troy@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211013102214.108814-1-rebecca.troy@intel.com> References: <20211013102214.108814-1-rebecca.troy@intel.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v5] cryptodev: add telemetry callbacks X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 --- 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 `_ + + +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 #include #include +#include #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"); +}