Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/125251/?format=api
https://patches.dpdk.org/api/patches/125251/?format=api", "web_url": "https://patches.dpdk.org/project/dpdk/patch/20230320021537.2297722-1-abdullah.sevincer@intel.com/", "project": { "id": 1, "url": "https://patches.dpdk.org/api/projects/1/?format=api", "name": "DPDK", "link_name": "dpdk", "list_id": "dev.dpdk.org", "list_email": "dev@dpdk.org", "web_url": "http://core.dpdk.org", "scm_url": "git://dpdk.org/dpdk", "webscm_url": "http://git.dpdk.org/dpdk", "list_archive_url": "https://inbox.dpdk.org/dev", "list_archive_url_format": "https://inbox.dpdk.org/dev/{}", "commit_url_format": "" }, "msgid": "<20230320021537.2297722-1-abdullah.sevincer@intel.com>", "list_archive_url": "https://inbox.dpdk.org/dev/20230320021537.2297722-1-abdullah.sevincer@intel.com", "date": "2023-03-20T02:15:37", "name": "[v10] app/procinfo: display eventdev xstats", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": true, "hash": "a2ff39e7df2968f4afcb737d8ec5ade145b66591", "submitter": { "id": 2843, "url": "https://patches.dpdk.org/api/people/2843/?format=api", "name": "Sevincer, Abdullah", "email": "abdullah.sevincer@intel.com" }, "delegate": null, "mbox": "https://patches.dpdk.org/project/dpdk/patch/20230320021537.2297722-1-abdullah.sevincer@intel.com/mbox/", "series": [ { "id": 27448, "url": "https://patches.dpdk.org/api/series/27448/?format=api", "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=27448", "date": "2023-03-20T02:15:37", "name": "[v10] app/procinfo: display eventdev xstats", "version": 10, "mbox": "https://patches.dpdk.org/series/27448/mbox/" } ], "comments": "https://patches.dpdk.org/api/patches/125251/comments/", "check": "success", "checks": "https://patches.dpdk.org/api/patches/125251/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<dev-bounces@dpdk.org>", "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])\n\tby inbox.dpdk.org (Postfix) with ESMTP id A586B427DC;\n\tMon, 20 Mar 2023 03:15:43 +0100 (CET)", "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 8485040A7F;\n\tMon, 20 Mar 2023 03:15:43 +0100 (CET)", "from mga07.intel.com (mga07.intel.com [134.134.136.100])\n by mails.dpdk.org (Postfix) with ESMTP id 246F2406BC\n for <dev@dpdk.org>; Mon, 20 Mar 2023 03:15:40 +0100 (CET)", "from orsmga003.jf.intel.com ([10.7.209.27])\n by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 19 Mar 2023 19:15:40 -0700", "from txanpdk02.an.intel.com ([10.123.117.76])\n by orsmga003.jf.intel.com with ESMTP; 19 Mar 2023 19:15:39 -0700" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1679278541; x=1710814541;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=+bieKAwLB7SEpG2HeqLYNgrB2Zsn8h1v/c1eZsyw0hY=;\n b=Q+dZmrD9K3lWx0l8kFHismjsrXTZLDEUppTie7bxMkiwO6KVkXRQLTBf\n EIs7KvWogPKXb3zQTDjFDYR5jgMdWm2sKfe2Hwe4rCcCwdA7leJuiWkbc\n Kto+Qe4nrSt+YSH/YZJGKxcAd/laueuuDXhFLe/ygxEX4J80h363HDLGP\n uiC2ivbuesgSxv9S2tezmdCiUbt2xPimfbLBWfZl7irrAa9/vcUAAd3xi\n XeJjQ56oHMy8H+m8N2ApzgO8AT24tTw2Z64/Mfp5hTTlt5KePknZ4mGGx\n q81AEJq0tKiJ+y0wOPLl5NGzG+tnkBe7pAm2UfrGILA8eQfJeOEis7M/D A==;", "X-IronPort-AV": [ "E=McAfee;i=\"6600,9927,10654\"; a=\"403430584\"", "E=Sophos;i=\"5.98,274,1673942400\"; d=\"scan'208\";a=\"403430584\"", "E=McAfee;i=\"6600,9927,10654\"; a=\"630951481\"", "E=Sophos;i=\"5.98,274,1673942400\"; d=\"scan'208\";a=\"630951481\"" ], "X-ExtLoop1": "1", "From": "Abdullah Sevincer <abdullah.sevincer@intel.com>", "To": "dev@dpdk.org", "Cc": "jerinj@marvell.com, reshma.pattan@intel.com,\n Abdullah Sevincer <abdullah.sevincer@intel.com>", "Subject": "[PATCH v10] app/procinfo: display eventdev xstats", "Date": "Sun, 19 Mar 2023 21:15:37 -0500", "Message-Id": "<20230320021537.2297722-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 <dev.dpdk.org>", "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>", "List-Archive": "<http://mails.dpdk.org/archives/dev/>", "List-Post": "<mailto:dev@dpdk.org>", "List-Help": "<mailto:dev-request@dpdk.org?subject=help>", "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>", "Errors-To": "dev-bounces@dpdk.org" }, "content": "This commit extends proc-info application to\ndisplay xstats for the eventdev devices.\n\nNew command line arguments are introduced to\ndisplay xstats for eventdev devices. The command\nexample is like:\n\nFor displaying a specific port stats (e.g. port 1):\n./dpdk-proc-info -- --show-edev-port-xstats=1:0\n\nIf any xstats parameters for eventdev passed through\nproc-info command line, proc-info will only display\nrequested eventdev data and exit.\n\nUsers should not pass any eventdev xstats parameters\nif they desire to dump other proc-info data such as\nRx/Tx descriptor dump.\nMore information can be found in proc-info app doc.\n\nSigned-off-by: Abdullah Sevincer <abdullah.sevincer@intel.com>\n---\n app/proc-info/main.c | 297 ++++++++++++++++++++++++++++++++-\n app/proc-info/meson.build | 2 +-\n doc/guides/tools/proc_info.rst | 32 +++-\n 3 files changed, 328 insertions(+), 3 deletions(-)", "diff": "diff --git a/app/proc-info/main.c b/app/proc-info/main.c\nindex 53e852a07c..c6a854c993 100644\n--- a/app/proc-info/main.c\n+++ b/app/proc-info/main.c\n@@ -40,11 +40,17 @@\n #include <rte_tm.h>\n #include <rte_hexdump.h>\n #include <rte_version.h>\n+#include <rte_eventdev.h>\n \n /* Maximum long option length for option parsing. */\n #define MAX_LONG_OPT_SZ 64\n #define MAX_STRING_LEN 256\n \n+/* Note: Port_queue_id in xstats APIs is 8 bits, so we have a maximum of\n+ * 256 ports and queues for event_Dev\n+ */\n+#define MAX_PORTS_QUEUES 256\n+\n #define ETHDEV_FWVERS_LEN 32\n #define RTE_RETA_CONF_GROUP_NUM 32\n #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))\n@@ -121,6 +127,18 @@ static uint32_t enable_shw_module_eeprom;\n static uint32_t enable_shw_rx_desc_dump;\n static uint32_t enable_shw_tx_desc_dump;\n \n+static uint32_t enable_shw_all_eventdev_queues;\n+static uint32_t enable_shw_all_eventdev_ports;\n+static uint32_t enable_dump_eventdev_xstats;\n+static uint32_t enable_eventdev_reset_xstats;\n+static uint32_t enable_shw_eventdev_device_xstats;\n+\n+static uint8_t evdev_id;\n+static uint8_t num_ports;\n+static uint8_t ports[MAX_PORTS_QUEUES];\n+static uint8_t num_queues;\n+static uint8_t queues[MAX_PORTS_QUEUES];\n+\n #define DESC_PARAM_NUM 3\n \n struct desc_param {\n@@ -172,7 +190,12 @@ proc_info_usage(const char *prgname)\n \t\t\t\"offset: The offset of the descriptor starting from tail. \"\n \t\t\t\"num: The number of the descriptors to dump.\\n\"\n \t\t\" --iter-mempool=name: iterate mempool elements to display content\\n\"\n-\t\t\" --dump-regs=file-prefix: dump registers to file with the file-prefix\\n\",\n+\t\t\" --dump-regs=file-prefix: dump registers to file with the file-prefix\\n\"\n+\t\t\" --show-edev-queue-xstats=queue_num:evdev_id or *:evdev_id to get queue xstats for specified queue or all queues;\\n\"\n+\t\t\" --show-edev-port-xstats=port_num:evdev_id or *:evdev_id to get queue xstats for specified port or all ports;\\n\"\n+\t\t\" --edev-dump-xstats=evdev_id to dump all event_dev xstats for specified eventdev device;\\n\"\n+\t\t\" --edev-reset-xstats=evdev_id to reset event_dev xstats after reading;\\n\"\n+\t\t\" --show-edev-device-xstats=evdev_id to get event_dev device xstats for specified eventdev device;\\n\",\n \t\tprgname);\n }\n \n@@ -236,6 +259,41 @@ parse_descriptor_param(char *list, struct desc_param *desc)\n \treturn 0;\n }\n \n+static int\n+parse_eventdev_queue_params(char *list)\n+{\n+\tint queue_id;\n+\n+\tif (sscanf(list, \"*:%hhu\", &evdev_id) == 1) {\n+\t\tenable_shw_all_eventdev_queues = 1;\n+\t} else if (sscanf(list, \"%d:%hhu\", &queue_id, &evdev_id) == 2) {\n+\t\tqueues[num_queues] = queue_id;\n+\t\tnum_queues++;\n+\t} else {\n+\t\treturn -EINVAL;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+parse_eventdev_port_params(char *list)\n+{\n+\tint port_id;\n+\n+\tif (sscanf(list, \"*:%hhu\", &evdev_id) == 1) {\n+\t\tenable_shw_all_eventdev_ports = 1;\n+\t} else if (sscanf(list, \"%d:%hhu\", &port_id, &evdev_id) == 2) {\n+\t\tports[num_ports] = port_id;\n+\t\tnum_ports++;\n+\t} else {\n+\t\treturn -EINVAL;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+\n static int\n proc_info_preparse_args(int argc, char **argv)\n {\n@@ -302,6 +360,11 @@ proc_info_parse_args(int argc, char **argv)\n \t\t{\"show-module-eeprom\", 0, NULL, 0},\n \t\t{\"show-rx-descriptor\", required_argument, NULL, 1},\n \t\t{\"show-tx-descriptor\", required_argument, NULL, 1},\n+\t\t{\"show-edev-queue-xstats\", required_argument, NULL, 0},\n+\t\t{\"show-edev-port-xstats\", required_argument, NULL, 0},\n+\t\t{\"edev-dump-xstats\", required_argument, NULL, 0},\n+\t\t{\"edev-reset-xstats\", required_argument, NULL, 0},\n+\t\t{\"show-edev-device-xstats\", required_argument, NULL, 0},\n \t\t{NULL, 0, 0, 0}\n \t};\n \n@@ -385,6 +448,35 @@ proc_info_parse_args(int argc, char **argv)\n \t\t\telse if (!strncmp(long_option[option_index].name,\n \t\t\t\t\t\"show-module-eeprom\", MAX_LONG_OPT_SZ))\n \t\t\t\tenable_shw_module_eeprom = 1;\n+\t\t\telse if (!strncmp(long_option[option_index].name,\n+\t\t\t\t\t\"edev-dump-xstats\", MAX_LONG_OPT_SZ)) {\n+\t\t\t\tenable_dump_eventdev_xstats = 1;\n+\t\t\t\tevdev_id = (uint8_t)atoi(optarg);\n+\t\t\t} else if (!strncmp(long_option[option_index].name,\n+\t\t\t\t\t\"edev-reset-xstats\", MAX_LONG_OPT_SZ)) {\n+\t\t\t\tenable_eventdev_reset_xstats = 1;\n+\t\t\t\tevdev_id = (uint8_t)atoi(optarg);\n+\t\t\t} else if (!strncmp(long_option[option_index].name,\n+\t\t\t\t\t\"show-edev-device-xstats\", MAX_LONG_OPT_SZ)) {\n+\t\t\t\tenable_shw_eventdev_device_xstats = 1;\n+\t\t\t\tevdev_id = (uint8_t)atoi(optarg);\n+\t\t\t} else if (!strncmp(long_option[option_index].name,\n+\t\t\t\t\t\"show-edev-queue-xstats\", MAX_LONG_OPT_SZ)) {\n+\t\t\t\tint ret = parse_eventdev_queue_params(optarg);\n+\t\t\t\tif (ret < 0) {\n+\t\t\t\t\tfprintf(stderr, \"Error parsing eventdev queue params: %s\\n\",\n+\t\t\t\t\t\tstrerror(-ret));\n+\t\t\t\t\treturn -1;\n+\t\t\t\t}\n+\t\t\t} else if (!strncmp(long_option[option_index].name,\n+\t\t\t\t\t\"show-edev-port-xstats\", MAX_LONG_OPT_SZ)) {\n+\t\t\t\tint ret = parse_eventdev_port_params(optarg);\n+\t\t\t\tif (ret < 0) {\n+\t\t\t\t\tfprintf(stderr, \"Error parsing eventdev port params: %s\\n\",\n+\t\t\t\t\t\tstrerror(-ret));\n+\t\t\t\t\treturn -1;\n+\t\t\t\t}\n+\t\t\t}\n \t\t\tbreak;\n \t\tcase 1:\n \t\t\t/* Print xstat single value given by name*/\n@@ -1744,6 +1836,187 @@ nic_tx_descriptor_display(uint16_t port_id, struct desc_param *desc)\n \t\t\tstrerror(-ret));\n }\n \n+static bool\n+show_edev_xstats(void)\n+{\n+\t/* Check if any event dev xstats requested from command line */\n+\tif (enable_shw_all_eventdev_queues || enable_shw_all_eventdev_ports\n+\t\t|| enable_dump_eventdev_xstats || enable_eventdev_reset_xstats ||\n+\t\tenable_shw_eventdev_device_xstats || num_ports > 0 || num_queues > 0)\n+\t\treturn true;\n+\n+\treturn false;\n+}\n+\n+static unsigned int\n+xstats_get_names_and_ids_size(uint8_t dev_id,\n+\t enum rte_event_dev_xstats_mode mode,\n+\t uint8_t queue_port_id)\n+{\n+\n+\tint ret;\n+\n+\t/* Get amount of storage required */\n+\tret = rte_event_dev_xstats_names_get(dev_id,\n+\t\t\t\t\t mode,\n+\t\t\t\t\t queue_port_id,\n+\t\t\t\t\t NULL, /* names */\n+\t\t\t\t\t NULL, /* ids */\n+\t\t\t\t\t 0); /* num */\n+\n+\tif (ret < 0)\n+\t\trte_panic(\"rte_event_dev_xstats_names_get err %d\\n\", ret);\n+\n+\treturn (unsigned int)ret;\n+\n+}\n+\n+static void\n+xstats_display(uint8_t dev_id,\n+\t enum rte_event_dev_xstats_mode mode,\n+\t uint8_t queue_port_id)\n+{\n+\tint ret;\n+\tstruct rte_event_dev_xstats_name *xstats_names;\n+\tuint64_t *ids;\n+\tuint64_t *values;\n+\tunsigned int size;\n+\tint i;\n+\n+\tsize = xstats_get_names_and_ids_size(dev_id, mode, queue_port_id);\n+\n+\tif (size == 0) {\n+\t\tprintf(\n+\t\t\"No stats available for this item, mode=%d, queue_port_id=%d\\n\",\n+\t\t\tmode, queue_port_id);\n+\t\treturn;\n+\t}\n+\n+\t/* Get memory to hold stat names, IDs, and values */\n+\txstats_names = malloc(sizeof(struct rte_event_dev_xstats_name) * size);\n+\tids = malloc(sizeof(unsigned int) * size);\n+\n+\tif (!xstats_names || !ids)\n+\t\trte_panic(\"unable to alloc memory for stats retrieval\\n\");\n+\n+\tret = rte_event_dev_xstats_names_get(dev_id, mode, queue_port_id,\n+\t\t\t\t\t xstats_names, ids,\n+\t\t\t\t\t size);\n+\tif (ret != (int)size)\n+\t\trte_panic(\"rte_event_dev_xstats_names_get err %d\\n\", ret);\n+\n+\tvalues = malloc(sizeof(uint64_t) * size);\n+\tif (!values)\n+\t\trte_panic(\"unable to alloc memory for stats retrieval\\n\");\n+\n+\tret = rte_event_dev_xstats_get(dev_id, mode, queue_port_id,\n+\t\t\t\t\t ids, values, size);\n+\n+\tif (ret != (int)size)\n+\t\trte_panic(\"rte_event_dev_xstats_get err %d\\n\", ret);\n+\n+\tfor (i = 0; i < (int)size; i++) {\n+\t\tprintf(\"id %\"PRIu64\" %s = %\"PRIu64\"\\n\",\n+\t\t\tids[i], &xstats_names[i].name[0], values[i]);\n+\t}\n+\n+\tfree(values);\n+\tfree(xstats_names);\n+\tfree(ids);\n+\n+}\n+\n+static void\n+xstats_reset(uint8_t dev_id,\n+\t enum rte_event_dev_xstats_mode mode,\n+\t uint8_t queue_port_id)\n+{\n+\tint ret;\n+\tstruct rte_event_dev_xstats_name *xstats_names;\n+\tuint64_t *ids;\n+\tunsigned int size;\n+\n+\tsize = xstats_get_names_and_ids_size(dev_id, mode, queue_port_id);\n+\n+\tif (size == 0) {\n+\t\tprintf(\n+\t\t\"No stats available for this item, mode=%d, queue_port_id=%d\\n\",\n+\t\t\tmode, queue_port_id);\n+\t\treturn;\n+\t}\n+\n+\t/* Get memory to hold stat names, IDs, and values */\n+\txstats_names = malloc(sizeof(struct rte_event_dev_xstats_name) * size);\n+\tids = malloc(sizeof(unsigned int) * size);\n+\n+\tif (!xstats_names || !ids)\n+\t\trte_panic(\"unable to alloc memory for stats retrieval\\n\");\n+\n+\tret = rte_event_dev_xstats_names_get(dev_id, mode, queue_port_id,\n+\t\t\t\t\t xstats_names, ids,\n+\t\t\t\t\t size);\n+\tif (ret != (int)size)\n+\t\trte_panic(\"rte_event_dev_xstats_names_get err %d\\n\", ret);\n+\n+\trte_event_dev_xstats_reset(dev_id, mode, queue_port_id,\n+\t\t\t\t\t ids, size);\n+\n+\tfree(xstats_names);\n+\tfree(ids);\n+\n+}\n+\n+\n+static void\n+process_eventdev_xstats(void)\n+{\n+\tint i;\n+\n+\tif (enable_shw_eventdev_device_xstats) {\n+\t\txstats_display(evdev_id,\n+\t\t\t RTE_EVENT_DEV_XSTATS_DEVICE,\n+\t\t\t 0);\n+\t\tif (enable_eventdev_reset_xstats)\n+\t\t\txstats_reset(evdev_id, RTE_EVENT_DEV_XSTATS_DEVICE, 0);\n+\t}\n+\n+\tif (enable_shw_all_eventdev_ports) {\n+\t\tfor (i = 0; i < MAX_PORTS_QUEUES; i++) {\n+\t\t\txstats_display(evdev_id,\n+\t\t\t\t RTE_EVENT_DEV_XSTATS_PORT,\n+\t\t\t\t i);\n+\t\t\tif (enable_eventdev_reset_xstats)\n+\t\t\t\txstats_reset(evdev_id, RTE_EVENT_DEV_XSTATS_PORT, i);\n+\t\t}\n+\t} else {\n+\t\tfor (i = 0; i < num_ports; i++) {\n+\t\t\txstats_display(evdev_id,\n+\t\t\t\t RTE_EVENT_DEV_XSTATS_PORT,\n+\t\t\t\t ports[i]);\n+\t\t\tif (enable_eventdev_reset_xstats)\n+\t\t\t\txstats_reset(evdev_id, RTE_EVENT_DEV_XSTATS_PORT, ports[i]);\n+\t\t}\n+\t}\n+\n+\tif (enable_shw_all_eventdev_queues) {\n+\t\tfor (i = 0; i < MAX_PORTS_QUEUES; i++) {\n+\t\t\txstats_display(evdev_id,\n+\t\t\t\t RTE_EVENT_DEV_XSTATS_QUEUE,\n+\t\t\t\t i);\n+\t\t\tif (enable_eventdev_reset_xstats)\n+\t\t\t\txstats_reset(evdev_id, RTE_EVENT_DEV_XSTATS_QUEUE, i);\n+\t\t}\n+\t} else {\n+\t\tfor (i = 0; i < num_queues; i++) {\n+\t\t\txstats_display(evdev_id,\n+\t\t\t\t RTE_EVENT_DEV_XSTATS_QUEUE,\n+\t\t\t\t queues[i]);\n+\t\t\tif (enable_eventdev_reset_xstats)\n+\t\t\t\txstats_reset(evdev_id, RTE_EVENT_DEV_XSTATS_QUEUE, queues[i]);\n+\t\t}\n+\t}\n+}\n+\n int\n main(int argc, char **argv)\n {\n@@ -1794,6 +2067,28 @@ main(int argc, char **argv)\n \t\treturn 0;\n \t}\n \n+\tif (show_edev_xstats()) {\n+\t\tconst uint8_t ndevs = rte_event_dev_count();\n+\n+\t\tif (ndevs == 0)\n+\t\t\trte_panic(\"No event devs found. Do you need\"\n+\t\t\t \" to pass in a --vdev flag?\\n\");\n+\n+\t\t/* Verify the command line options */\n+\t\tif (evdev_id >= rte_event_dev_count())\n+\t\t\trte_panic(\"invalid event device %hhu\\n\", evdev_id);\n+\n+\n+\t\tif (enable_dump_eventdev_xstats) {\n+\t\t\tret = rte_event_dev_dump(evdev_id, stdout);\n+\t\t\tif (ret)\n+\t\t\t\trte_panic(\"dump failed with err=%d\\n\", ret);\n+\t\t}\n+\n+\t\tprocess_eventdev_xstats();\n+\t\treturn 0;\n+\t}\n+\n \tnb_ports = rte_eth_dev_count_avail();\n \tif (nb_ports == 0)\n \t\trte_exit(EXIT_FAILURE, \"No Ethernet ports - bye\\n\");\ndiff --git a/app/proc-info/meson.build b/app/proc-info/meson.build\nindex 1563ce656a..4f83f29a64 100644\n--- a/app/proc-info/meson.build\n+++ b/app/proc-info/meson.build\n@@ -8,7 +8,7 @@ if is_windows\n endif\n \n sources = files('main.c')\n-deps += ['ethdev', 'security']\n+deps += ['ethdev', 'security', 'eventdev']\n if dpdk_conf.has('RTE_LIB_METRICS')\n deps += 'metrics'\n endif\ndiff --git a/doc/guides/tools/proc_info.rst b/doc/guides/tools/proc_info.rst\nindex cf3502a8cb..f0a7d37e41 100644\n--- a/doc/guides/tools/proc_info.rst\n+++ b/doc/guides/tools/proc_info.rst\n@@ -22,7 +22,9 @@ The application has a number of command line options:\n --show-ring[=name] | --show-mempool[=name] | --iter-mempool=name |\n --show-port-private | --version | --firmware-version | --show-rss-reta |\n --show-module-eeprom | --show-rx-descriptor queue_id:offset:num |\n- --show-tx-descriptor queue_id:offset:num ]\n+ --show-tx-descriptor queue_id:offset:num | --show-edev-queue-xstats=queue_num |\n+ --show-edev-port-xstats=port_num | --edev-dump-xstats | --edev-reset-xstats |\n+ --show-edev-device-xstats]\n \n Parameters\n ~~~~~~~~~~\n@@ -101,6 +103,34 @@ queue_id: A Tx queue identifier on this port.\n offset: The offset of the descriptor starting from tail.\n num: The number of the descriptors to dump.\n \n+**--show-edev-queue-xstats queue_num:evdev_id**\n+The show-edev-queue-xstats parameter enables stats for specified queue or all queues.\n+queue_num: The queue number to get queue xstats for this specified queue or * for all queues.\n+evdev_id: Id of the eventdev device to display xstats.\n+\n+**--show-edev-port-xstats port_num:evdev_id**\n+The show-edev-port-xstats parameter enables stats for specified port or all ports.\n+port_num: The port number to get port xstats for this specified port or * for all ports.\n+evdev_id: Id of the eventdev device to display xstats.\n+\n+**--edev-dump-xstats evdev_id**\n+The edev-dump-xstats parameter dumps all eventdev stats.\n+evdev_id: Id of the eventdev device to display xstats.\n+\n+**--edev-reset-xstats evdev_id**\n+The edev-reset-xstats parameter resets eventdev xstats after reading.\n+evdev_id: Id of the eventdev device to display xstats.\n+\n+**--show-edev-device-xstats evdev_id**\n+The show-edev-device-xstats parameter displays eventdev device xstats.\n+evdev_id: Id of the eventdev device to display xstats.\n+\n+A typical command line usage for eventdev stats:\n+\n+ .. code-block:: console\n+\n+ ./dpdk-proc-info -- --show-edev-port-xstats=1:0\n+\n Limitations\n -----------\n \n", "prefixes": [ "v10" ] }{ "id": 125251, "url": "