From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4AD89A0507; Fri, 1 Apr 2022 16:54:08 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D80DA42911; Fri, 1 Apr 2022 16:54:07 +0200 (CEST) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mails.dpdk.org (Postfix) with ESMTP id 295954067E for ; Fri, 1 Apr 2022 16:54:05 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1648824846; x=1680360846; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=UuzGastwXwJIQT5WbMfuV+dw5scUDPmBe2iEkE5Nhdw=; b=mAGV7PqL76QWbn5l/BUBHhma0lvC+BPRVn3xk6FNC9FNnOs3GE/mfSSM 9PwSxjnRLt9DjojPb4ptWmjbjhYi7+DsQY+EgE8d5SGs1k9bXa8OiUsAW MfJCEEwMucM0RVEa3Gj+B+onY7ZPlZOiwD8bOgnjlp1YEwysrPNtfTiL+ kzpKy25fpjRNAatkX/GN4dHF0NtSaDr2eFBTijPeqQZ5Td7NrIiqAJnee dXXJDG4jOHfZ96sPymVaDdUcMthfWVbB5Z7UHvRGHgusFEotf8cz8BtzG Y6c4BdlgYZdhg9tRtk9tP9KU0D/rYXsbkXunlmiAnUIeOuoPH8/N3j/qR Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10304"; a="240745080" X-IronPort-AV: E=Sophos;i="5.90,227,1643702400"; d="scan'208";a="240745080" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Apr 2022 07:54:04 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.90,227,1643702400"; d="scan'208";a="567546375" Received: from silpixa00401215.ir.intel.com ([10.55.128.100]) by orsmga008.jf.intel.com with ESMTP; 01 Apr 2022 07:54:02 -0700 From: Sean Morrissey To: Chengwen Feng , Kevin Laatz , Bruce Richardson Cc: dev@dpdk.org, Sean Morrissey , Sunil Pai G , Conor Walsh Subject: [PATCH v4] dmadev: add telemetry support Date: Fri, 1 Apr 2022 14:53:59 +0000 Message-Id: <20220401145359.2285492-1-sean.morrissey@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220401102402.2249057-1-sean.morrissey@intel.com> References: <20220401102402.2249057-1-sean.morrissey@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 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 Tested-by: Sunil Pai G Reviewed-by: Bruce Richardson Reviewed-by: Conor Walsh --- 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 #include #include +#include #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