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 3C3EF427DC; Mon, 20 Mar 2023 03:23:21 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1FC5240E01; Mon, 20 Mar 2023 03:23:21 +0100 (CET) Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by mails.dpdk.org (Postfix) with ESMTP id E1973406BC for ; Mon, 20 Mar 2023 03:23:19 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1679279000; x=1710815000; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=Z+7sl3fAqshWrGqvbQ6OuHYL2n2Vz40p/nqkpyU3/Jc=; b=U1vrVyd7vWlkZX5+CV1Elk8BQtiytEllzkrOxm/DAs51ZsPv8j5fKOqc ydJZAy2KflrlnQX7Yg9V5X+4OkXKbKBF7KLHoi3WukLhy21dw32Yh3nJ7 owzCWblI5eKlPrCJ2eBmRFtzdAJE/dwhYonN+tbmdzGBXVJPKG/J/6V2P xqmQ5RE/JcEP3kURIctcBpOqeg8KThy3Ul0Fap17EVgqbK2sSgsj1okoJ De9a6roFVb2HxSGXRR/QCptbaNx4UBGlov0NXG+1FYRlDQsIhOIcy8tCB Qhv5CIKL2aFpFTQDmE+eFgHWNG5bbx1l5Nv/JSUdxD6gEyjoWZVc6oz0R w==; X-IronPort-AV: E=McAfee;i="6600,9927,10654"; a="424834953" X-IronPort-AV: E=Sophos;i="5.98,274,1673942400"; d="scan'208";a="424834953" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Mar 2023 19:23:19 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10654"; a="791421637" X-IronPort-AV: E=Sophos;i="5.98,274,1673942400"; d="scan'208";a="791421637" Received: from txanpdk02.an.intel.com ([10.123.117.76]) by fmsmga002.fm.intel.com with ESMTP; 19 Mar 2023 19:23:18 -0700 From: Abdullah Sevincer To: dev@dpdk.org Cc: jerinj@marvell.com, reshma.pattan@intel.com, Abdullah Sevincer Subject: [PATCH v12] app/procinfo: display eventdev xstats Date: Sun, 19 Mar 2023 21:23:16 -0500 Message-Id: <20230320022316.2298874-1-abdullah.sevincer@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230309185143.1006949-1-abdullah.sevincer@intel.com> References: <20230309185143.1006949-1-abdullah.sevincer@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 This commit extends proc-info application to display xstats for the eventdev devices. New command line arguments are introduced to display xstats for eventdev devices. The command example is like: For displaying a specific port stats (e.g. port 1): ./dpdk-proc-info -- --show-edev-port-xstats=1:0 If any xstats parameters for eventdev passed through proc-info command line, proc-info will only display requested eventdev data and exit. Users should not pass any eventdev xstats parameters if they desire to dump other proc-info data such 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 | 294 ++++++++++++++++++++++++++++++++- app/proc-info/meson.build | 2 +- doc/guides/tools/proc_info.rst | 32 +++- 3 files changed, 325 insertions(+), 3 deletions(-) diff --git a/app/proc-info/main.c b/app/proc-info/main.c index 53e852a07c..0e0d8ab4ce 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,18 @@ 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_shw_all_eventdev_queues; +static uint32_t enable_shw_all_eventdev_ports; +static uint32_t enable_dump_eventdev_xstats; +static uint32_t enable_eventdev_reset_xstats; +static uint32_t enable_shw_eventdev_device_xstats; + +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 +190,12 @@ 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" + " --show-edev-queue-xstats=queue_num:evdev_id or *:evdev_id to get queue xstats for specified queue or all queues;\n" + " --show-edev-port-xstats=port_num:evdev_id or *:evdev_id to get queue xstats for specified port or all ports;\n" + " --edev-dump-xstats=evdev_id to dump all event_dev xstats for specified eventdev device;\n" + " --edev-reset-xstats=evdev_id to reset event_dev xstats after reading;\n" + " --show-edev-device-xstats=evdev_id to get event_dev device xstats for specified eventdev device;\n", prgname); } @@ -236,6 +259,40 @@ parse_descriptor_param(char *list, struct desc_param *desc) return 0; } +static int +parse_eventdev_queue_params(char *list) +{ + int queue_id; + + if (sscanf(list, "*:%hhu", &evdev_id) == 1) { + enable_shw_all_eventdev_queues = 1; + } else if (sscanf(list, "%d:%hhu", &queue_id, &evdev_id) == 2) { + queues[num_queues] = queue_id; + num_queues++; + } else { + return -EINVAL; + } + + return 0; +} + +static int +parse_eventdev_port_params(char *list) +{ + int port_id; + + if (sscanf(list, "*:%hhu", &evdev_id) == 1) { + enable_shw_all_eventdev_ports = 1; + } else if (sscanf(list, "%d:%hhu", &port_id, &evdev_id) == 2) { + ports[num_ports] = port_id; + num_ports++; + } else { + return -EINVAL; + } + + return 0; +} + static int proc_info_preparse_args(int argc, char **argv) { @@ -302,6 +359,11 @@ 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}, + {"show-edev-queue-xstats", required_argument, NULL, 0}, + {"show-edev-port-xstats", required_argument, NULL, 0}, + {"edev-dump-xstats", required_argument, NULL, 0}, + {"edev-reset-xstats", required_argument, NULL, 0}, + {"show-edev-device-xstats", required_argument, NULL, 0}, {NULL, 0, 0, 0} }; @@ -385,6 +447,35 @@ 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-dump-xstats", MAX_LONG_OPT_SZ)) { + enable_dump_eventdev_xstats = 1; + evdev_id = (uint8_t)atoi(optarg); + } else if (!strncmp(long_option[option_index].name, + "edev-reset-xstats", MAX_LONG_OPT_SZ)) { + enable_eventdev_reset_xstats = 1; + evdev_id = (uint8_t)atoi(optarg); + } else if (!strncmp(long_option[option_index].name, + "show-edev-device-xstats", MAX_LONG_OPT_SZ)) { + enable_shw_eventdev_device_xstats = 1; + evdev_id = (uint8_t)atoi(optarg); + } else if (!strncmp(long_option[option_index].name, + "show-edev-queue-xstats", MAX_LONG_OPT_SZ)) { + int ret = parse_eventdev_queue_params(optarg); + if (ret < 0) { + fprintf(stderr, "Error parsing eventdev queue params: %s\n", + strerror(-ret)); + return -1; + } + } else if (!strncmp(long_option[option_index].name, + "show-edev-port-xstats", MAX_LONG_OPT_SZ)) { + int ret = parse_eventdev_port_params(optarg); + if (ret < 0) { + fprintf(stderr, "Error parsing eventdev port params: %s\n", + strerror(-ret)); + return -1; + } + } break; case 1: /* Print xstat single value given by name*/ @@ -1744,6 +1835,186 @@ nic_tx_descriptor_display(uint16_t port_id, struct desc_param *desc) strerror(-ret)); } +static bool +show_edev_xstats(void) +{ + /* Check if any event dev xstats requested from command line */ + if (enable_shw_all_eventdev_queues || enable_shw_all_eventdev_ports + || enable_dump_eventdev_xstats || enable_eventdev_reset_xstats || + enable_shw_eventdev_device_xstats || num_ports > 0 || num_queues > 0) + return true; + + return false; +} + +static unsigned int +xstats_get_names_and_ids_size(uint8_t dev_id, + enum rte_event_dev_xstats_mode mode, + uint8_t queue_port_id) +{ + + int ret; + + /* 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); + + return (unsigned int)ret; + +} + +static void +xstats_display(uint8_t dev_id, + enum rte_event_dev_xstats_mode mode, + uint8_t queue_port_id) +{ + int ret; + struct rte_event_dev_xstats_name *xstats_names; + uint64_t *ids; + uint64_t *values; + unsigned int size; + int i; + + size = xstats_get_names_and_ids_size(dev_id, mode, queue_port_id); + + if (size == 0) { + printf( + "No stats available for this item, mode=%d, queue_port_id=%d\n", + mode, queue_port_id); + return; + } + + /* 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); + + 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); + free(xstats_names); + free(ids); + +} + +static void +xstats_reset(uint8_t dev_id, + enum rte_event_dev_xstats_mode mode, + uint8_t queue_port_id) +{ + int ret; + struct rte_event_dev_xstats_name *xstats_names; + uint64_t *ids; + unsigned int size; + + size = xstats_get_names_and_ids_size(dev_id, mode, queue_port_id); + + if (size == 0) { + printf( + "No stats available for this item, mode=%d, queue_port_id=%d\n", + mode, queue_port_id); + return; + } + + /* 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); + + rte_event_dev_xstats_reset(dev_id, mode, queue_port_id, + ids, size); + + free(xstats_names); + free(ids); + +} + +static void +process_eventdev_xstats(void) +{ + int i; + + if (enable_shw_eventdev_device_xstats) { + xstats_display(evdev_id, + RTE_EVENT_DEV_XSTATS_DEVICE, + 0); + if (enable_eventdev_reset_xstats) + xstats_reset(evdev_id, RTE_EVENT_DEV_XSTATS_DEVICE, 0); + } + + if (enable_shw_all_eventdev_ports) { + for (i = 0; i < MAX_PORTS_QUEUES; i++) { + xstats_display(evdev_id, + RTE_EVENT_DEV_XSTATS_PORT, + i); + if (enable_eventdev_reset_xstats) + xstats_reset(evdev_id, RTE_EVENT_DEV_XSTATS_PORT, i); + } + } else { + for (i = 0; i < num_ports; i++) { + xstats_display(evdev_id, + RTE_EVENT_DEV_XSTATS_PORT, + ports[i]); + if (enable_eventdev_reset_xstats) + xstats_reset(evdev_id, RTE_EVENT_DEV_XSTATS_PORT, ports[i]); + } + } + + if (enable_shw_all_eventdev_queues) { + for (i = 0; i < MAX_PORTS_QUEUES; i++) { + xstats_display(evdev_id, + RTE_EVENT_DEV_XSTATS_QUEUE, + i); + if (enable_eventdev_reset_xstats) + xstats_reset(evdev_id, RTE_EVENT_DEV_XSTATS_QUEUE, i); + } + } else { + for (i = 0; i < num_queues; i++) { + xstats_display(evdev_id, + RTE_EVENT_DEV_XSTATS_QUEUE, + queues[i]); + if (enable_eventdev_reset_xstats) + xstats_reset(evdev_id, RTE_EVENT_DEV_XSTATS_QUEUE, queues[i]); + } + } +} + int main(int argc, char **argv) { @@ -1794,6 +2065,27 @@ main(int argc, char **argv) return 0; } + if (show_edev_xstats()) { + 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"); + + /* Verify the command line options */ + if (evdev_id >= rte_event_dev_count()) + rte_panic("invalid event device %hhu\n", evdev_id); + + if (enable_dump_eventdev_xstats) { + ret = rte_event_dev_dump(evdev_id, stdout); + if (ret) + rte_panic("dump failed with err=%d\n", ret); + } + + process_eventdev_xstats(); + 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..f0a7d37e41 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 | --show-edev-queue-xstats=queue_num | + --show-edev-port-xstats=port_num | --edev-dump-xstats | --edev-reset-xstats | + --show-edev-device-xstats] Parameters ~~~~~~~~~~ @@ -101,6 +103,34 @@ 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. +**--show-edev-queue-xstats queue_num:evdev_id** +The show-edev-queue-xstats parameter enables stats for specified queue or all queues. +queue_num: The queue number to get queue xstats for this specified queue or * for all queues. +evdev_id: Id of the eventdev device to display xstats. + +**--show-edev-port-xstats port_num:evdev_id** +The show-edev-port-xstats parameter enables stats for specified port or all ports. +port_num: The port number to get port xstats for this specified port or * for all ports. +evdev_id: Id of the eventdev device to display xstats. + +**--edev-dump-xstats evdev_id** +The edev-dump-xstats parameter dumps all eventdev stats. +evdev_id: Id of the eventdev device to display xstats. + +**--edev-reset-xstats evdev_id** +The edev-reset-xstats parameter resets eventdev xstats after reading. +evdev_id: Id of the eventdev device to display xstats. + +**--show-edev-device-xstats evdev_id** +The show-edev-device-xstats parameter displays eventdev device xstats. +evdev_id: Id of the eventdev device to display xstats. + +A typical command line usage for eventdev stats: + + .. code-block:: console + + ./dpdk-proc-info -- --show-edev-port-xstats=1:0 + Limitations ----------- -- 2.25.1