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

Signed-off-by: Chengwen Feng <fengcheng...@huawei.com>
---
 lib/ethdev/rte_ethdev.c | 28 ++++++++++++++++++++++------
 1 file changed, 22 insertions(+), 6 deletions(-)

diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
index 2fc593b865..77cacc0829 100644
--- a/lib/ethdev/rte_ethdev.c
+++ b/lib/ethdev/rte_ethdev.c
@@ -5870,20 +5870,33 @@ eth_dev_handle_port_xstats(const char *cmd __rte_unused,
 {
        struct rte_eth_xstat *eth_xstats;
        struct rte_eth_xstat_name *xstat_names;
+       char *end_param, *hide_param;
        int port_id, num_xstats;
+       int hide_zero = 0;
        int i, ret;
-       char *end_param;
 
        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\n");
        if (!rte_eth_dev_is_valid_port(port_id))
                return -1;
 
+       if (*end_param != '\0') {
+               hide_param = strtok(end_param, ",");
+               if (!hide_param || strlen(hide_param) == 0 || 
!isdigit(*hide_param))
+                       return -EINVAL;
+               hide_zero = strtoul(hide_param, &end_param, 0);
+               if (*end_param != '\0')
+                       RTE_ETHDEV_LOG(NOTICE,
+                               "Extra parameters passed to ethdev telemetry 
command, ignoring\n");
+               if (hide_zero != 0 && hide_zero != 1) {
+                       hide_zero = !!hide_zero;
+                       RTE_ETHDEV_LOG(NOTICE,
+                               "Hide zero parameter is non-boolean, cast to 
boolean\n");
+               }
+       }
+
        num_xstats = rte_eth_xstats_get(port_id, NULL, 0);
        if (num_xstats < 0)
                return -1;
@@ -5908,9 +5921,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_u64(d, xstat_names[i].name,
                                eth_xstats[i].value);
+       }
        free(eth_xstats);
        return 0;
 }
@@ -6354,7 +6370,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 (Optional, specify whether to hide zero values)");
        rte_telemetry_register_cmd("/ethdev/xstats_reset", 
eth_dev_handle_port_xstats_reset,
                        "Reset the extended stats for a port. Parameters: int 
port_id");
 #ifndef RTE_EXEC_ENV_WINDOWS
-- 
2.17.1

Reply via email to