[dpdk-dev] [PATCH v3 08/10] app/proc_info: change xstats to use integer ids

Remy Horton remy.horton at intel.com
Mon May 30 12:48:10 CEST 2016


The current extended ethernet statistics fetching involve doing several
string operations, which causes performance issues if there are lots of
statistics and/or network interfaces. This patch changes the proc_info
application to use the new API that seperates name string and value
queries.

Signed-off-by: Remy Horton <remy.horton at intel.com>
---
 app/proc_info/main.c | 26 +++++++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

diff --git a/app/proc_info/main.c b/app/proc_info/main.c
index 5f83092..ef71fcf 100644
--- a/app/proc_info/main.c
+++ b/app/proc_info/main.c
@@ -1,7 +1,7 @@
 /*
  *   BSD LICENSE
  *
- *   Copyright(c) 2010-2015 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2010-2016 Intel Corporation. All rights reserved.
  *   All rights reserved.
  *
  *   Redistribution and use in source and binary forms, with or without
@@ -243,11 +243,13 @@ nic_stats_clear(uint8_t port_id)
 static void
 nic_xstats_display(uint8_t port_id)
 {
+	struct rte_eth_xstats_name *ptr_names;
 	struct rte_eth_xstats *xstats;
 	int len, ret, i;
+	int idx_name;
 	static const char *nic_stats_border = "########################";
 
-	len = rte_eth_xstats_get(port_id, NULL, 0);
+	len = rte_eth_xstats_count(port_id);
 	if (len < 0) {
 		printf("Cannot get xstats count\n");
 		return;
@@ -258,6 +260,18 @@ nic_xstats_display(uint8_t port_id)
 		return;
 	}
 
+	ptr_names = malloc(sizeof(struct rte_eth_xstats_name) * len);
+	if (ptr_names == NULL) {
+		printf("Cannot allocate memory for xstat names\n");
+		free(xstats);
+		return;
+	}
+	if (len != rte_eth_xstats_names(
+			port_id, ptr_names, len)) {
+		printf("Cannot get xstat names\n");
+		return;
+	}
+
 	printf("###### NIC extended statistics for port %-2d #########\n",
 			   port_id);
 	printf("%s############################\n",
@@ -270,11 +284,17 @@ nic_xstats_display(uint8_t port_id)
 	}
 
 	for (i = 0; i < len; i++)
-		printf("%s: %"PRIu64"\n", xstats[i].name, xstats[i].value);
+		for (idx_name = 0; idx_name < len; idx_name++)
+			if (ptr_names[idx_name].id == xstats[i].id) {
+				printf("%s: %lu\n", ptr_names[idx_name].name,
+					xstats[i].value);
+				break;
+			}
 
 	printf("%s############################\n",
 			   nic_stats_border);
 	free(xstats);
+	free(ptr_names);
 }
 
 static void
-- 
2.5.5



More information about the dev mailing list