The number of xstats may be large, after the hide zero option is added,
only non-zero values can be displayed.

So display xstats with hide zero:
        /ethdev/xstats,0,hide_zero=true
and without hide zero:
        /ethdev/xstats,0,hide_zero=false  or
        /ethdev/xstats,0

Signed-off-by: Chengwen Feng <fengcheng...@huawei.com>

---
v3: fix only hide_zero cause segment fault, support hide_zero=false,
    and these address Ferruh's comments.
v2: using hide_zero=true optional parameter which address Ferruh's
    comments.

---
 lib/ethdev/rte_ethdev.c | 43 +++++++++++++++++++++++++++++++++++------
 1 file changed, 37 insertions(+), 6 deletions(-)

diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
index d25db35f7f..fa98af1f91 100644
--- a/lib/ethdev/rte_ethdev.c
+++ b/lib/ethdev/rte_ethdev.c
@@ -15,6 +15,7 @@
 #include <bus_driver.h>
 #include <rte_log.h>
 #include <rte_interrupts.h>
+#include <rte_kvargs.h>
 #include <rte_memcpy.h>
 #include <rte_common.h>
 #include <rte_mempool.h>
@@ -5863,27 +5864,54 @@ eth_dev_handle_port_stats(const char *cmd __rte_unused,
        return 0;
 }
 
+static int
+eth_dev_parse_hide_zero(const char *key, const char *value, void *extra_args)
+{
+       RTE_SET_USED(key);
+
+       if (value == NULL)
+               return -1;
+
+       if (strcmp(value, "true") == 0)
+               *(bool *)extra_args = true;
+       else if (strcmp(value, "false") == 0)
+               *(bool *)extra_args = false;
+       else
+               return -1;
+
+       return 0;
+}
+
 static int
 eth_dev_handle_port_xstats(const char *cmd __rte_unused,
                const char *params,
                struct rte_tel_data *d)
 {
+       const char *const valid_keys[] = { "hide_zero", NULL };
        struct rte_eth_xstat *eth_xstats;
        struct rte_eth_xstat_name *xstat_names;
+       struct rte_kvargs *kvlist;
        int port_id, num_xstats;
-       int i, ret;
+       bool hide_zero = false;
        char *end_param;
+       int i, ret;
 
        if (params == NULL || strlen(params) == 0 || !isdigit(*params))
                return -1;
 
        port_id = strtoul(params, &end_param, 0);
-       if (*end_param != '\0')
-               RTE_ETHDEV_LOG(NOTICE,
-                       "Extra parameters passed to ethdev telemetry command, 
ignoring");
        if (!rte_eth_dev_is_valid_port(port_id))
                return -1;
 
+       if (*end_param != '\0') {
+               kvlist = rte_kvargs_parse(end_param, valid_keys);
+               ret = rte_kvargs_process(kvlist, NULL, eth_dev_parse_hide_zero, 
&hide_zero);
+               if (kvlist == NULL || ret != 0)
+                       RTE_ETHDEV_LOG(NOTICE,
+                               "Unknown extra parameters passed to ethdev 
telemetry command, ignoring\n");
+               rte_kvargs_free(kvlist);
+       }
+
        num_xstats = rte_eth_xstats_get(port_id, NULL, 0);
        if (num_xstats < 0)
                return -1;
@@ -5908,9 +5936,12 @@ eth_dev_handle_port_xstats(const char *cmd __rte_unused,
        }
 
        rte_tel_data_start_dict(d);
-       for (i = 0; i < num_xstats; i++)
+       for (i = 0; i < num_xstats; i++) {
+               if (hide_zero && eth_xstats[i].value == 0)
+                       continue;
                rte_tel_data_add_dict_uint(d, xstat_names[i].name,
                                           eth_xstats[i].value);
+       }
        free(eth_xstats);
        return 0;
 }
@@ -6328,7 +6359,7 @@ RTE_INIT(ethdev_init_telemetry)
        rte_telemetry_register_cmd("/ethdev/stats", eth_dev_handle_port_stats,
                        "Returns the common stats for a port. Parameters: int 
port_id");
        rte_telemetry_register_cmd("/ethdev/xstats", eth_dev_handle_port_xstats,
-                       "Returns the extended stats for a port. Parameters: int 
port_id");
+                       "Returns the extended stats for a port. Parameters: int 
port_id,hide_zero=true|false(Optional for indicates hide zero xstats)");
 #ifndef RTE_EXEC_ENV_WINDOWS
        rte_telemetry_register_cmd("/ethdev/dump_priv", 
eth_dev_handle_port_dump_priv,
                        "Returns dump private information for a port. 
Parameters: int port_id");
-- 
2.17.1

Reply via email to