get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/125251/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 125251,
    "url": "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"
    ]
}