From patchwork Tue Feb 7 00:04:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abdullah Sevincer X-Patchwork-Id: 123176 X-Patchwork-Delegate: thomas@monjalon.net 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 EDA6D41C26; Tue, 7 Feb 2023 01:04:51 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7650B40F18; Tue, 7 Feb 2023 01:04:51 +0100 (CET) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mails.dpdk.org (Postfix) with ESMTP id B92AE40ED9 for ; Tue, 7 Feb 2023 01:04:49 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1675728290; x=1707264290; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ZJaCL5gdOMk3ea4vN7Igv0V5uDqgkW0NV/LPJu2s3ww=; b=If+zOb8qkbw7zcc5LEsC+il9Ei0r9piOdd8+0tM+bvJqPFusaZZT4/f2 /j8t03BywMfdQLIyvAiRzahxanXCa34gpV62PjStRqOro9WBCKldPEg7S J0Vetwm5/cHo0Iy+DiypZAP+cPMZa/0paZPQxlnedEeVVSYIEhjM66aUa ef4MX1Nm1djmyoJux9pz639I52+Tc+HIk/LZeNw0+4HA78YOoQcL5UskU 05aETZ//YVNsc4NZ2McXFZB8Wt6ZQF7DPndQkwwDOpCgK8lhvuES2+lPp cRhHfGi8r7FqTmKQ+AExPNnQyj/bBo4tYnxsRuSvdVMW3Rddi5/IP2Eqg w==; X-IronPort-AV: E=McAfee;i="6500,9779,10613"; a="393952035" X-IronPort-AV: E=Sophos;i="5.97,276,1669104000"; d="scan'208";a="393952035" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Feb 2023 16:04:48 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10613"; a="730181990" X-IronPort-AV: E=Sophos;i="5.97,276,1669104000"; d="scan'208";a="730181990" Received: from txanpdk02.an.intel.com ([10.123.117.76]) by fmsmga008.fm.intel.com with ESMTP; 06 Feb 2023 16:04:47 -0800 From: Abdullah Sevincer To: dev@dpdk.org Cc: jerinj@marvell.com, Abdullah Sevincer Subject: [PATCH v4] app/procinfo: display eventdev xstats for PMD data Date: Mon, 6 Feb 2023 18:04:45 -0600 Message-Id: <20230207000445.3031449-1-abdullah.sevincer@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220409153056.1010236-1-timothy.mcdaniel@intel.com> References: <20220409153056.1010236-1-timothy.mcdaniel@intel.com> MIME-Version: 1.0 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 This commit extends proc-info application to display xstats and PMD dump data for the eventdev devices. New command line arguments are introduced to display stats for eventdev devices. The command example is like: For displaying a specific port stats (e.g. port 1): dpdk-proc-info -- --edev-stats-enable --edev-port=1 edev-stats-enable: This parameters enables proc-info to display xstats for eventdev devices. If the parameter is enabled through proc-info command line, proc-info will only dump event_dev data and exit. Users should not enable this flag if they desire to dump other proc-info data suc as Rx/Tx descriptor dump. More information can be found in proc-info app doc. Signed-off-by: Abdullah Sevincer --- app/proc-info/main.c | 208 ++++++++++++++++++++++++++++++++- app/proc-info/meson.build | 2 +- doc/guides/tools/proc_info.rst | 42 ++++++- 3 files changed, 249 insertions(+), 3 deletions(-) diff --git a/app/proc-info/main.c b/app/proc-info/main.c index 53e852a07c..25b36205d0 100644 --- a/app/proc-info/main.c +++ b/app/proc-info/main.c @@ -40,11 +40,17 @@ #include #include #include +#include /* Maximum long option length for option parsing. */ #define MAX_LONG_OPT_SZ 64 #define MAX_STRING_LEN 256 +/* Note: Port_queue_id in xstats APIs is 8 bits, so we have a maximum of + * 256 ports and queues for event_Dev + */ +#define MAX_PORTS_QUEUES 256 + #define ETHDEV_FWVERS_LEN 32 #define RTE_RETA_CONF_GROUP_NUM 32 #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) @@ -121,6 +127,19 @@ static uint32_t enable_shw_module_eeprom; static uint32_t enable_shw_rx_desc_dump; static uint32_t enable_shw_tx_desc_dump; +static uint32_t enable_eventdev_stats; +static uint32_t enable_shw_all_eventdev_queues; +static uint32_t enable_shw_all_eventdev_ports; +static uint32_t enable_dump_eventdev; +static uint32_t enable_eventdev_reset_stats; +static uint32_t enable_shw_eventdev_device_stats; + +static uint8_t evdev_id; +static uint8_t num_ports; +static uint8_t ports[MAX_PORTS_QUEUES]; +static uint8_t num_queues; +static uint8_t queues[MAX_PORTS_QUEUES]; + #define DESC_PARAM_NUM 3 struct desc_param { @@ -172,7 +191,15 @@ proc_info_usage(const char *prgname) "offset: The offset of the descriptor starting from tail. " "num: The number of the descriptors to dump.\n" " --iter-mempool=name: iterate mempool elements to display content\n" - " --dump-regs=file-prefix: dump registers to file with the file-prefix\n", + " --dump-regs=file-prefix: dump registers to file with the file-prefix\n" + " --edev-stats-enable to enable stats for all event_dev queues, ports, device etc;\n" + " --all-edev-queues to get stats for all event_dev queues;\n" + " --edev-queue=queue_num to get queue stats for specified queue;\n" + " --all-edev-ports to get stats for all event_dev ports;\n" + " --edev-port=port_num to get queue stats for specified port;\n" + " --edev-dump to dump all event_dev stats;\n" + " --edev-reset to reset event_dev stats after reading;\n" + " --edev-device-stats to get event_dev device stats;\n", prgname); } @@ -302,6 +329,14 @@ proc_info_parse_args(int argc, char **argv) {"show-module-eeprom", 0, NULL, 0}, {"show-rx-descriptor", required_argument, NULL, 1}, {"show-tx-descriptor", required_argument, NULL, 1}, + {"edev-stats-enable", 0, NULL, 0}, + {"all-edev-queues", 0, NULL, 0}, + {"edev-queue", required_argument, NULL, 0}, + {"all-edev-ports", 0, NULL, 0}, + {"edev-port", required_argument, NULL, 0}, + {"edev-dump", 0, NULL, 0}, + {"edev-reset", 0, NULL, 0}, + {"edev-device-stats", 0, NULL, 0}, {NULL, 0, 0, 0} }; @@ -385,6 +420,33 @@ proc_info_parse_args(int argc, char **argv) else if (!strncmp(long_option[option_index].name, "show-module-eeprom", MAX_LONG_OPT_SZ)) enable_shw_module_eeprom = 1; + else if (!strncmp(long_option[option_index].name, + "edev-stats-enable", MAX_LONG_OPT_SZ)) { + enable_eventdev_stats = 1; + } else if (!strncmp(long_option[option_index].name, + "all-edev-queues", MAX_LONG_OPT_SZ)) { + enable_shw_all_eventdev_queues = 1; + } else if (!strncmp(long_option[option_index].name, + "all-edev-ports", MAX_LONG_OPT_SZ)) { + enable_shw_all_eventdev_ports = 1; + } else if (!strncmp(long_option[option_index].name, + "edev-dump", MAX_LONG_OPT_SZ)) { + enable_dump_eventdev = 1; + } else if (!strncmp(long_option[option_index].name, + "edev-reset", MAX_LONG_OPT_SZ)) { + enable_eventdev_reset_stats = 1; + } else if (!strncmp(long_option[option_index].name, + "edev-device-stats", MAX_LONG_OPT_SZ)) { + enable_shw_eventdev_device_stats = 1; + } else if (!strncmp(long_option[option_index].name, + "edev-queue", MAX_LONG_OPT_SZ)) { + queues[num_queues] = atoi(optarg); + num_queues++; + } else if (!strncmp(long_option[option_index].name, + "edev-port", MAX_LONG_OPT_SZ)) { + ports[num_ports] = atoi(optarg); + num_ports++; + } break; case 1: /* Print xstat single value given by name*/ @@ -1744,6 +1806,126 @@ nic_tx_descriptor_display(uint16_t port_id, struct desc_param *desc) strerror(-ret)); } +static void +get_eventdev_stats(uint8_t dev_id, + enum rte_event_dev_xstats_mode mode, + uint8_t queue_port_id, + bool reset) +{ + int ret; + struct rte_event_dev_xstats_name *xstats_names; + uint64_t *ids; + unsigned int size; + int i; + + + /* Get amount of storage required */ + ret = rte_event_dev_xstats_names_get(dev_id, + mode, + queue_port_id, + NULL, /* names */ + NULL, /* ids */ + 0); /* num */ + + if (ret < 0) + rte_panic("rte_event_dev_xstats_names_get err %d\n", ret); + + if (ret == 0) { + printf( + "No stats available for this item, mode=%d, queue_port_id=%d\n", + mode, queue_port_id); + return; + } + + size = (unsigned int)ret; /* number of names */ + + /* Get memory to hold stat names, IDs, and values */ + + xstats_names = malloc(sizeof(struct rte_event_dev_xstats_name) * size); + ids = malloc(sizeof(unsigned int) * size); + + + if (!xstats_names || !ids) + rte_panic("unable to alloc memory for stats retrieval\n"); + + ret = rte_event_dev_xstats_names_get(dev_id, mode, queue_port_id, + xstats_names, ids, + size); + if (ret != (int)size) + rte_panic("rte_event_dev_xstats_names_get err %d\n", ret); + + if (!reset) { + uint64_t *values; + + values = malloc(sizeof(uint64_t) * size); + if (!values) + rte_panic("unable to alloc memory for stats retrieval\n"); + + ret = rte_event_dev_xstats_get(dev_id, mode, queue_port_id, + ids, values, size); + + if (ret != (int)size) + rte_panic("rte_event_dev_xstats_get err %d\n", ret); + + for (i = 0; i < (int)size; i++) { + printf("id %"PRIu64" %s = %"PRIu64"\n", + ids[i], &xstats_names[i].name[0], values[i]); + } + + free(values); + } else + rte_event_dev_xstats_reset(dev_id, mode, queue_port_id, + ids, size); + + free(xstats_names); + free(ids); +} + +static void +process_eventdev_stats(bool reset) +{ + int i; + + if (enable_shw_eventdev_device_stats) { + get_eventdev_stats(evdev_id, + RTE_EVENT_DEV_XSTATS_DEVICE, + 0, + reset); + } + + if (enable_shw_all_eventdev_ports) { + for (i = 0; i < MAX_PORTS_QUEUES; i++) { + get_eventdev_stats(evdev_id, + RTE_EVENT_DEV_XSTATS_PORT, + i, + reset); + } + } else { + for (i = 0; i < num_ports; i++) { + get_eventdev_stats(evdev_id, + RTE_EVENT_DEV_XSTATS_PORT, + ports[i], + reset); + } + } + + if (enable_shw_all_eventdev_queues) { + for (i = 0; i < MAX_PORTS_QUEUES; i++) { + get_eventdev_stats(evdev_id, + RTE_EVENT_DEV_XSTATS_QUEUE, + i, + reset); + } + } else { + for (i = 0; i < num_queues; i++) { + get_eventdev_stats(evdev_id, + RTE_EVENT_DEV_XSTATS_QUEUE, + queues[i], + reset); + } + } +} + int main(int argc, char **argv) { @@ -1794,6 +1976,30 @@ main(int argc, char **argv) return 0; } + if (enable_eventdev_stats) { + const uint8_t ndevs = rte_event_dev_count(); + + if (ndevs == 0) + rte_panic("No event devs found. Do you need" + " to pass in a --vdev flag?\n"); + + if (ndevs > 1) + printf("Warning: More than one event dev, but using idx 0\n"); + + if (enable_dump_eventdev) { + ret = rte_event_dev_dump(evdev_id, stdout); + if (ret) + rte_panic("dump failed with err=%d\n", ret); + } + + process_eventdev_stats(false); + + if (enable_eventdev_reset_stats) + process_eventdev_stats(true); + + return 0; + } + nb_ports = rte_eth_dev_count_avail(); if (nb_ports == 0) rte_exit(EXIT_FAILURE, "No Ethernet ports - bye\n"); diff --git a/app/proc-info/meson.build b/app/proc-info/meson.build index 1563ce656a..4f83f29a64 100644 --- a/app/proc-info/meson.build +++ b/app/proc-info/meson.build @@ -8,7 +8,7 @@ if is_windows endif sources = files('main.c') -deps += ['ethdev', 'security'] +deps += ['ethdev', 'security', 'eventdev'] if dpdk_conf.has('RTE_LIB_METRICS') deps += 'metrics' endif diff --git a/doc/guides/tools/proc_info.rst b/doc/guides/tools/proc_info.rst index cf3502a8cb..59d8ff2490 100644 --- a/doc/guides/tools/proc_info.rst +++ b/doc/guides/tools/proc_info.rst @@ -22,7 +22,9 @@ The application has a number of command line options: --show-ring[=name] | --show-mempool[=name] | --iter-mempool=name | --show-port-private | --version | --firmware-version | --show-rss-reta | --show-module-eeprom | --show-rx-descriptor queue_id:offset:num | - --show-tx-descriptor queue_id:offset:num ] + --show-tx-descriptor queue_id:offset:num | --edev-stats-enable | + --all-edev-queues | --edev-queue=queue_num | --all-edev-ports | + --edev-port=port_num | --edev-dump | --edev-reset | --edev-device-stats] Parameters ~~~~~~~~~~ @@ -101,6 +103,44 @@ queue_id: A Tx queue identifier on this port. offset: The offset of the descriptor starting from tail. num: The number of the descriptors to dump. +**--edev-stats-enable** +The edev-stats-enable parameter enables proc-info application +to display stats for eventdev devices. If the parameter is entered +through proc-info application command line, proc-info application will +only dump eventdev data and exit from the application. Hence, +this parameter is required and a must with other eventdev parameters +explained below. Users should not enable this flag if they desire to dump +other proc-info application stats such as Rx/Tx descriptor dump. + +**--all-edev-queues** +The all-edev-queues parameter enables stats for all eventdev queues. + +**--edev-queue** +The edev-queue parameter enables stats for specified queue. +queue_num: The queue number to get queue stats for this specified queue. + +**--all-edev-ports** +The all-edev-ports parameter enables stats for all eventdev ports. + +**--edev-port** +The edev-port parameter enables stats for specified port. +queue_num: The port number to get port stats for this specified port. + +**--edev-dump** +The edev-dump parameter dumps all eventdev stats. + +**--edev-reset** +The edev-reset parameter resets eventdev stats after reading. + +**--edev-device-stats** +The edev-device-stats parameter displays eventdev device stats. + +A typical command line usage for eventdev stats: + + .. code-block:: console + + ./dpdk-proc-info -- --edev-stats-enable --edev-port=1 + Limitations -----------