get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 93911,
    "url": "http://patches.dpdk.org/api/patches/93911/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20210604144225.287678-12-andrew.rybchenko@oktetlabs.ru/",
    "project": {
        "id": 1,
        "url": "http://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": "<20210604144225.287678-12-andrew.rybchenko@oktetlabs.ru>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210604144225.287678-12-andrew.rybchenko@oktetlabs.ru",
    "date": "2021-06-04T14:42:25",
    "name": "[11/11] app/testpmd: add option to display extended statistics",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "8d9cd3ca60ce7a07b3c29b324974b3815b6dd52d",
    "submitter": {
        "id": 2013,
        "url": "http://patches.dpdk.org/api/people/2013/?format=api",
        "name": "Andrew Rybchenko",
        "email": "Andrew.Rybchenko@oktetlabs.ru"
    },
    "delegate": {
        "id": 24651,
        "url": "http://patches.dpdk.org/api/users/24651/?format=api",
        "username": "dmarchand",
        "first_name": "David",
        "last_name": "Marchand",
        "email": "david.marchand@redhat.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20210604144225.287678-12-andrew.rybchenko@oktetlabs.ru/mbox/",
    "series": [
        {
            "id": 17239,
            "url": "http://patches.dpdk.org/api/series/17239/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=17239",
            "date": "2021-06-04T14:42:14",
            "name": "net/sfc: provide Rx/Tx doorbells stats",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/17239/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/93911/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/93911/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 52A30A0A0F;\n\tFri,  4 Jun 2021 16:43:57 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id E5D6B410E8;\n\tFri,  4 Jun 2021 16:43:27 +0200 (CEST)",
            "from shelob.oktetlabs.ru (shelob.oktetlabs.ru [91.220.146.113])\n by mails.dpdk.org (Postfix) with ESMTP id DCC4B410DB\n for <dev@dpdk.org>; Fri,  4 Jun 2021 16:43:26 +0200 (CEST)",
            "by shelob.oktetlabs.ru (Postfix, from userid 122)\n id B17E17F684; Fri,  4 Jun 2021 17:43:26 +0300 (MSK)",
            "from aros.oktetlabs.ru (aros.oktetlabs.ru [192.168.38.17])\n by shelob.oktetlabs.ru (Postfix) with ESMTP id 0A3D87F68B;\n Fri,  4 Jun 2021 17:42:37 +0300 (MSK)"
        ],
        "X-Spam-Checker-Version": "SpamAssassin 3.4.2 (2018-09-13) on shelob.oktetlabs.ru",
        "X-Spam-Level": "",
        "X-Spam-Status": "No, score=0.8 required=5.0 tests=ALL_TRUSTED,\n DKIM_ADSP_DISCARD,\n URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2",
        "DKIM-Filter": "OpenDKIM Filter v2.11.0 shelob.oktetlabs.ru 0A3D87F68B",
        "Authentication-Results": "shelob.oktetlabs.ru/0A3D87F68B; dkim=none;\n dkim-atps=neutral",
        "From": "Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>",
        "To": "dev@dpdk.org",
        "Cc": "Ivan Ilchenko <ivan.ilchenko@oktetlabs.ru>,\n Xiaoyun Li <xiaoyun.li@intel.com>",
        "Date": "Fri,  4 Jun 2021 17:42:25 +0300",
        "Message-Id": "<20210604144225.287678-12-andrew.rybchenko@oktetlabs.ru>",
        "X-Mailer": "git-send-email 2.30.2",
        "In-Reply-To": "<20210604144225.287678-1-andrew.rybchenko@oktetlabs.ru>",
        "References": "<20210604144225.287678-1-andrew.rybchenko@oktetlabs.ru>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH 11/11] app/testpmd: add option to display\n extended statistics",
        "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",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Ivan Ilchenko <ivan.ilchenko@oktetlabs.ru>\n\nAdd 'display-xstats' option for using in accompanying with Rx/Tx statistics\n(i.e. 'stats-period' option or 'show port stats' interactive command) to\ndisplay specified list of extended statistics.\n\nSigned-off-by: Ivan Ilchenko <ivan.ilchenko@oktetlabs.ru>\nSigned-off-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>\n---\n app/test-pmd/cmdline.c                |  56 ++++++++++++\n app/test-pmd/config.c                 |  66 ++++++++++++++\n app/test-pmd/parameters.c             |  18 ++++\n app/test-pmd/testpmd.c                | 122 ++++++++++++++++++++++++++\n app/test-pmd/testpmd.h                |  21 +++++\n doc/guides/testpmd_app_ug/run_app.rst |   5 ++\n 6 files changed, 288 insertions(+)",
    "diff": "diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c\nindex 0268b18f95..b1fd136982 100644\n--- a/app/test-pmd/cmdline.c\n+++ b/app/test-pmd/cmdline.c\n@@ -3613,6 +3613,62 @@ cmdline_parse_inst_t cmd_stop = {\n \n /* *** SET CORELIST and PORTLIST CONFIGURATION *** */\n \n+int\n+parse_xstats_list(char *in_str, struct rte_eth_xstat_name **xstats,\n+\t\t  unsigned int *xstats_num)\n+{\n+\tint max_names_nb, names_nb;\n+\tint stringlen;\n+\tchar **names;\n+\tchar *str;\n+\tint ret;\n+\tint i;\n+\n+\tnames = NULL;\n+\tstr = strdup(in_str);\n+\tif (str == NULL) {\n+\t\tret = ENOMEM;\n+\t\tgoto out;\n+\t}\n+\tstringlen = strlen(str);\n+\n+\tfor (i = 0, max_names_nb = 1; str[i] != '\\0'; i++) {\n+\t\tif (str[i] == ',')\n+\t\t\tmax_names_nb++;\n+\t}\n+\n+\tnames = calloc(max_names_nb, sizeof(*names));\n+\tif (names == NULL) {\n+\t\tret = ENOMEM;\n+\t\tgoto out;\n+\t}\n+\n+\tnames_nb = rte_strsplit(str, stringlen, names, max_names_nb, ',');\n+\tprintf(\"max names is %d\\n\", max_names_nb);\n+\tif (names_nb < 0) {\n+\t\tret = EINVAL;\n+\t\tgoto out;\n+\t}\n+\n+\t*xstats = calloc(names_nb, sizeof(**xstats));\n+\tif (*xstats == NULL) {\n+\t\tret = ENOMEM;\n+\t\tgoto out;\n+\t}\n+\n+\tfor (i = 0; i < names_nb; i++)\n+\t\trte_strscpy((*xstats)[i].name, names[i],\n+\t\t\t    sizeof((*xstats)[i].name));\n+\n+\t*xstats_num = names_nb;\n+\tret = 0;\n+\n+out:\n+\tfree(names);\n+\tfree(str);\n+\treturn ret;\n+}\n+\n unsigned int\n parse_item_list(char* str, const char* item_name, unsigned int max_items,\n \t\tunsigned int *parsed_items, int check_unique_values)\ndiff --git a/app/test-pmd/config.c b/app/test-pmd/config.c\nindex 43c79b5021..8e71b664cd 100644\n--- a/app/test-pmd/config.c\n+++ b/app/test-pmd/config.c\n@@ -173,6 +173,70 @@ print_ethaddr(const char *name, struct rte_ether_addr *eth_addr)\n \tprintf(\"%s%s\", name, buf);\n }\n \n+static void\n+nic_xstats_display_periodic(portid_t port_id)\n+{\n+\tstruct xstat_display_info *xstats_info;\n+\tuint64_t *prev_values, *curr_values;\n+\tuint64_t diff_value, value_rate;\n+\tuint64_t *ids, *ids_supp;\n+\tstruct timespec cur_time;\n+\tunsigned int i, i_supp;\n+\tsize_t ids_supp_sz;\n+\tuint64_t diff_ns;\n+\tint rc;\n+\n+\txstats_info = &xstats_per_port[port_id];\n+\n+\tids_supp_sz = xstats_info->ids_supp_sz;\n+\tif (xstats_display_num == 0 || ids_supp_sz == 0)\n+\t\treturn;\n+\n+\tprintf(\"\\n\");\n+\n+\tids = xstats_info->ids;\n+\tids_supp = xstats_info->ids_supp;\n+\tprev_values = xstats_info->prev_values;\n+\tcurr_values = xstats_info->curr_values;\n+\n+\trc = rte_eth_xstats_get_by_id(port_id, ids_supp, curr_values,\n+\t\t\t\t      ids_supp_sz);\n+\tif (rc != (int)ids_supp_sz) {\n+\t\tfprintf(stderr, \"%s: Failed to get values of %zu supported xstats for port %u - return code %d\\n\",\n+\t\t\t__func__, ids_supp_sz, port_id, rc);\n+\t\treturn;\n+\t}\n+\n+\tdiff_ns = 0;\n+\tif (clock_gettime(CLOCK_TYPE_ID, &cur_time) == 0) {\n+\t\tuint64_t ns;\n+\n+\t\tns = cur_time.tv_sec * NS_PER_SEC;\n+\t\tns += cur_time.tv_nsec;\n+\n+\t\tif (xstats_info->prev_ns != 0)\n+\t\t\tdiff_ns = ns - xstats_info->prev_ns;\n+\t\txstats_info->prev_ns = ns;\n+\t}\n+\n+\tprintf(\"%-31s%-17s%s\\n\", \" \", \"Value\", \"Rate (since last show)\");\n+\tfor (i = i_supp = 0; i < xstats_display_num; i++) {\n+\t\tif (ids[i] == XSTAT_ID_INVALID)\n+\t\t\tcontinue;\n+\n+\t\tdiff_value = (curr_values[i_supp] > prev_values[i]) ?\n+\t\t\t     (curr_values[i_supp] - prev_values[i]) : 0;\n+\t\tprev_values[i] = curr_values[i_supp];\n+\t\tvalue_rate = diff_ns > 0 ?\n+\t\t\t\t(double)diff_value / diff_ns * NS_PER_SEC : 0;\n+\n+\t\tprintf(\"  %-25s%12\"PRIu64\" %15\"PRIu64\"\\n\",\n+\t\t       xstats_display[i].name, curr_values[i_supp], value_rate);\n+\n+\t\ti_supp++;\n+\t}\n+}\n+\n void\n nic_stats_display(portid_t port_id)\n {\n@@ -243,6 +307,8 @@ nic_stats_display(portid_t port_id)\n \t       PRIu64\"          Tx-bps: %12\"PRIu64\"\\n\", mpps_rx, mbps_rx * 8,\n \t       mpps_tx, mbps_tx * 8);\n \n+\tnic_xstats_display_periodic(port_id);\n+\n \tprintf(\"  %s############################%s\\n\",\n \t       nic_stats_border, nic_stats_border);\n }\ndiff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c\nindex f3954c1c63..0fecc5e8f8 100644\n--- a/app/test-pmd/parameters.c\n+++ b/app/test-pmd/parameters.c\n@@ -62,6 +62,9 @@ usage(char* progname)\n \t       \"(only if interactive is disabled).\\n\");\n \tprintf(\"  --stats-period=PERIOD: statistics will be shown \"\n \t       \"every PERIOD seconds (only if interactive is disabled).\\n\");\n+\tprintf(\"  --display-xstats xstat1[,...]: extended statistics to show. \"\n+\t       \"Used with --stats-period specified or interactive commands \"\n+\t       \"that show Rx/Tx statistics (i.e. 'show port stats').\\n\");\n \tprintf(\"  --nb-cores=N: set the number of forwarding cores \"\n \t       \"(1 <= N <= %d).\\n\", nb_lcores);\n \tprintf(\"  --nb-ports=N: set the number of forwarding ports \"\n@@ -531,6 +534,7 @@ launch_args_parse(int argc, char** argv)\n #endif\n \t\t{ \"tx-first\",\t\t\t0, 0, 0 },\n \t\t{ \"stats-period\",\t\t1, 0, 0 },\n+\t\t{ \"display-xstats\",\t\t1, 0, 0 },\n \t\t{ \"nb-cores\",\t\t\t1, 0, 0 },\n \t\t{ \"nb-ports\",\t\t\t1, 0, 0 },\n \t\t{ \"coremask\",\t\t\t1, 0, 0 },\n@@ -686,6 +690,20 @@ launch_args_parse(int argc, char** argv)\n \t\t\t\tstats_period = n;\n \t\t\t\tbreak;\n \t\t\t}\n+\t\t\tif (!strcmp(lgopts[opt_idx].name, \"display-xstats\")) {\n+\t\t\t\tchar rc;\n+\n+\t\t\t\trc = parse_xstats_list(optarg, &xstats_display,\n+\t\t\t\t\t\t       &xstats_display_num);\n+\t\t\t\tif (rc != 0)\n+\t\t\t\t\trte_exit(EXIT_FAILURE,\n+\t\t\t\t\t\t \"Failed to fill xstats to display: %d\\n\",\n+\t\t\t\t\t\t rc);\n+\n+\t\t\t\tif (alloc_display_xstats_info() != 0)\n+\t\t\t\t\trte_exit(EXIT_FAILURE,\n+\t\t\t\t\t\t \"Failed to alloc xstats display memory\\n\");\n+\t\t\t}\n \t\t\tif (!strcmp(lgopts[opt_idx].name,\n \t\t\t\t    \"eth-peers-configfile\")) {\n \t\t\t\tif (init_peer_eth_addrs(optarg) != 0)\ndiff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c\nindex 8ed1b97dec..8ce61cb0ff 100644\n--- a/app/test-pmd/testpmd.c\n+++ b/app/test-pmd/testpmd.c\n@@ -203,6 +203,14 @@ uint32_t param_total_num_mbufs = 0;  /**< number of mbufs in all pools - if\n                                       * specified on command-line. */\n uint16_t stats_period; /**< Period to show statistics (disabled by default) */\n \n+/** Extended statistics to show. */\n+struct rte_eth_xstat_name *xstats_display;\n+\n+unsigned int xstats_display_num; /**< Size of extended statistics to show */\n+\n+/** Helper structures for each port to show extended statistics. */\n+struct xstat_display_info xstats_per_port[RTE_MAX_ETHPORTS];\n+\n /*\n  * In container, it cannot terminate the process which running with 'stats-period'\n  * option. Set flag to exit stats period loop after received SIGINT/SIGTERM.\n@@ -537,6 +545,12 @@ uint16_t gso_max_segment_size = RTE_ETHER_MAX_LEN - RTE_ETHER_CRC_LEN;\n /* Holds the registered mbuf dynamic flags names. */\n char dynf_names[64][RTE_MBUF_DYN_NAMESIZE];\n \n+/** Fill helper structures for specified port to show extended statistics. */\n+static void fill_display_xstats_info_for_port(portid_t pi);\n+\n+/** Fill helper structures for all ports to show extended statistics. */\n+static void fill_display_xstats_info(void);\n+\n /*\n  * Helper function to check if socket is already discovered.\n  * If yes, return positive value. If not, return zero.\n@@ -2675,6 +2689,8 @@ start_port(portid_t pid)\n \t\t}\n \t}\n \n+\tfill_display_xstats_info_for_port(pid);\n+\n \tprintf(\"Done\\n\");\n \treturn 0;\n }\n@@ -3693,6 +3709,110 @@ force_quit(void)\n \tprompt_exit();\n }\n \n+int\n+alloc_display_xstats_info(void)\n+{\n+\tportid_t port;\n+\tuint64_t *mem;\n+\tsize_t mem_size;\n+\n+\tif (xstats_display_num == 0)\n+\t\treturn 0;\n+\n+\tmemset(xstats_per_port, 0, sizeof(xstats_per_port));\n+\n+\tfor (port = 0; port < RTE_MAX_ETHPORTS; port++) {\n+\t\tuint64_t **ids = &xstats_per_port[port].ids;\n+\t\tuint64_t **ids_supp = &xstats_per_port[port].ids_supp;\n+\t\tuint64_t **prev_values = &xstats_per_port[port].prev_values;\n+\t\tuint64_t **curr_values = &xstats_per_port[port].curr_values;\n+\n+\t\tif (port == 0) {\n+\t\t\tmem_size = RTE_MAX_ETHPORTS * xstats_display_num *\n+\t\t\t\t   (sizeof(**ids) + sizeof(**ids_supp) +\n+\t\t\t\t    sizeof(**prev_values) +\n+\t\t\t\t    sizeof(**curr_values));\n+\n+\t\t\tmem = malloc(mem_size);\n+\t\t\tif (mem == NULL)\n+\t\t\t\treturn -ENOMEM;\n+\n+\t\t\tmemset(mem, 0, mem_size);\n+\t\t}\n+\n+\t\t*ids = mem;\n+\t\tmem += xstats_display_num * sizeof(**ids);\n+\n+\t\t*ids_supp = mem;\n+\t\tmem += xstats_display_num * sizeof(**ids_supp);\n+\n+\t\t*prev_values = mem;\n+\t\tmem += xstats_display_num * sizeof(**prev_values);\n+\n+\t\t*curr_values = mem;\n+\t\tmem += xstats_display_num * sizeof(**curr_values);\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static void\n+fill_display_xstats_info_for_port(portid_t pi)\n+{\n+\tunsigned int stat, stat_supp;\n+\tuint64_t *ids, *ids_supp;\n+\tconst char *xstat_name;\n+\tstruct rte_port *port;\n+\tint rc;\n+\n+\tif (xstats_display_num == 0)\n+\t\treturn;\n+\n+\tif (pi == (portid_t)RTE_PORT_ALL) {\n+\t\tfill_display_xstats_info();\n+\t\treturn;\n+\t}\n+\n+\tport = &ports[pi];\n+\tif (port->port_status != RTE_PORT_STARTED)\n+\t\treturn;\n+\n+\tids = xstats_per_port[pi].ids;\n+\tids_supp = xstats_per_port[pi].ids_supp;\n+\n+\tfor (stat = stat_supp = 0; stat < xstats_display_num; stat++) {\n+\t\txstat_name = xstats_display[stat].name;\n+\n+\t\trc = rte_eth_xstats_get_id_by_name(pi, xstat_name,\n+\t\t\t\t\t\t   ids + stat);\n+\t\tif (rc != 0) {\n+\t\t\tids[stat] = XSTAT_ID_INVALID;\n+\t\t\tprintf(\"No xstat '%s' on port %u - skip it\\n\",\n+\t\t\t       xstat_name, pi);\n+\t\t\tcontinue;\n+\t\t}\n+\t\tids_supp[stat_supp++] = ids[stat];\n+\t}\n+\n+\txstats_per_port[pi].ids_supp_sz = stat_supp;\n+}\n+\n+static void\n+fill_display_xstats_info(void)\n+{\n+\tportid_t pi;\n+\n+\tif (xstats_display_num == 0)\n+\t\treturn;\n+\n+\tRTE_ETH_FOREACH_DEV(pi) {\n+\t\tif (pi == (portid_t)RTE_PORT_ALL)\n+\t\t\tcontinue;\n+\n+\t\tfill_display_xstats_info_for_port(pi);\n+\t}\n+}\n+\n static void\n print_stats(void)\n {\n@@ -3889,6 +4009,8 @@ main(int argc, char** argv)\n \t}\n #endif\n \n+\tfill_display_xstats_info();\n+\n #ifdef RTE_LIB_CMDLINE\n \tif (strlen(cmdline_filename) != 0)\n \t\tcmdline_read_from_file(cmdline_filename);\ndiff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h\nindex 283b5e3680..d5a42a9e9c 100644\n--- a/app/test-pmd/testpmd.h\n+++ b/app/test-pmd/testpmd.h\n@@ -433,6 +433,24 @@ extern uint32_t param_total_num_mbufs;\n \n extern uint16_t stats_period;\n \n+extern struct rte_eth_xstat_name *xstats_display;\n+extern unsigned int xstats_display_num;\n+\n+#define XSTAT_ID_INVALID UINT64_MAX\n+\n+/** Information for an extended statistics to show. */\n+struct xstat_display_info {\n+\t/** IDs of xstats in the order of xstats_display */\n+\tuint64_t *ids;\n+\t/** Supported xstats IDs in the order of xstats_display */\n+\tuint64_t *ids_supp;\n+\tsize_t   ids_supp_sz;\n+\tuint64_t *prev_values;\n+\tuint64_t *curr_values;\n+\tuint64_t prev_ns;\n+};\n+extern struct xstat_display_info xstats_per_port[];\n+\n extern uint16_t hairpin_mode;\n \n #ifdef RTE_LIB_LATENCYSTATS\n@@ -765,6 +783,8 @@ inc_tx_burst_stats(struct fwd_stream *fs, uint16_t nb_tx)\n unsigned int parse_item_list(char* str, const char* item_name,\n \t\t\tunsigned int max_items,\n \t\t\tunsigned int *parsed_items, int check_unique_values);\n+int parse_xstats_list(char *in_str, struct rte_eth_xstat_name **xstats,\n+\t\t      unsigned int *xstats_num);\n void launch_args_parse(int argc, char** argv);\n void cmdline_read_from_file(const char *filename);\n void prompt(void);\n@@ -977,6 +997,7 @@ enum print_warning {\n int port_id_is_invalid(portid_t port_id, enum print_warning warning);\n void print_valid_ports(void);\n int new_socket_id(unsigned int socket_id);\n+int alloc_display_xstats_info(void);\n \n queueid_t get_allowed_max_nb_rxq(portid_t *pid);\n int check_nb_rxq(queueid_t rxq);\ndiff --git a/doc/guides/testpmd_app_ug/run_app.rst b/doc/guides/testpmd_app_ug/run_app.rst\nindex eb48318353..3e5ba81f18 100644\n--- a/doc/guides/testpmd_app_ug/run_app.rst\n+++ b/doc/guides/testpmd_app_ug/run_app.rst\n@@ -56,6 +56,11 @@ The command line options are:\n     Display statistics every PERIOD seconds, if interactive mode is disabled.\n     The default value is 0, which means that the statistics will not be displayed.\n \n+*   ``--display-xstats xstat1[,...]``\n+\n+    Display extended statistics every PERIOD seconds as specified in ``--stats-period``\n+    or when used with interactive commands that show Rx/Tx statistics (i.e. 'show port stats').\n+\n *   ``--nb-cores=N``\n \n     Set the number of forwarding cores,\n",
    "prefixes": [
        "11/11"
    ]
}