From patchwork Thu Apr 13 14:59:26 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kuba Kozak X-Patchwork-Id: 23622 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 3B1C637A0; Thu, 13 Apr 2017 15:05:13 +0200 (CEST) Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by dpdk.org (Postfix) with ESMTP id 9E20A2986 for ; Thu, 13 Apr 2017 15:05:11 +0200 (CEST) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Apr 2017 06:05:10 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos; i="5.37,194,1488873600"; d="scan'208"; a="1135018819" Received: from gklab-246-019.igk.intel.com (HELO intel.com) ([10.217.246.19]) by fmsmga001.fm.intel.com with SMTP; 13 Apr 2017 06:05:08 -0700 Received: by intel.com (sSMTP sendmail emulation); Thu, 13 Apr 2017 17:06:18 +0200 From: Kuba Kozak To: dev@dpdk.org Cc: harry.van.haaren@intel.com, deepak.k.jain@intel.com, Kuba Kozak Date: Thu, 13 Apr 2017 16:59:26 +0200 Message-Id: <1492095568-20993-4-git-send-email-kubax.kozak@intel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1492095568-20993-1-git-send-email-kubax.kozak@intel.com> References: <1491928644-10383-2-git-send-email-michalx.k.jastrzebski@intel.com> <1492095568-20993-1-git-send-email-kubax.kozak@intel.com> Subject: [dpdk-dev] [PATCH v6 3/5] proc-info: add support for new xstats API X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" There is a new argument --xstats-ids and --xstats-name in proc_info command line to retrieve statistics given by ids and by name. E.g. --xstats-ids="1,3,5,7,8" E.g. --xstats-name rx_errors ethdev: mark functions as deprecated Functions rte_eth_xstats_get_all and rte_eth_xstats_get_names_all are marked as deprecated Signed-off-by: Kuba Kozak Acked-by: Harry van Haaren --- app/proc_info/main.c | 150 ++++++++++++++++++++++++++++++++++++++---- lib/librte_ether/rte_ethdev.c | 4 +- lib/librte_ether/rte_ethdev.h | 2 + 3 files changed, 143 insertions(+), 13 deletions(-) diff --git a/app/proc_info/main.c b/app/proc_info/main.c index 9f5e219..9c9b2b5 100644 --- a/app/proc_info/main.c +++ b/app/proc_info/main.c @@ -86,6 +86,14 @@ static uint32_t reset_xstats; /**< Enable memory info. */ static uint32_t mem_info; +/**< Enable displaying xstat name. */ +static uint32_t enable_xstats_name; +static char *xstats_name; + +/**< Enable xstats by ids. */ +#define MAX_NB_XSTATS_IDS 1024 +static uint32_t nb_xstats_ids; +static uint64_t xstats_ids[MAX_NB_XSTATS_IDS]; /**< display usage */ static void @@ -99,6 +107,9 @@ "default\n" " --metrics: to display derived metrics of the ports, disabled by " "default\n" + " --xstats-name NAME: to display single xstat value by NAME\n" + " --xstats-ids IDLIST: to display xstat values by id. " + "The argument is comma-separated list of xstat ids to print out.\n" " --stats-reset: to reset port statistics\n" " --xstats-reset: to reset port extended statistics\n" " --collectd-format: to print statistics to STDOUT in expected by collectd format\n" @@ -132,6 +143,33 @@ } +/* + * Parse ids value list into array + */ +static int +parse_xstats_ids(char *list, uint64_t *ids, int limit) { + int length; + char *token; + char *ctx = NULL; + char *endptr; + + length = 0; + token = strtok_r(list, ",", &ctx); + while (token != NULL) { + ids[length] = strtoull(token, &endptr, 10); + if (*endptr != '\0') + return -EINVAL; + + length++; + if (length >= limit) + return -E2BIG; + + token = strtok_r(NULL, ",", &ctx); + } + + return length; +} + static int proc_info_preparse_args(int argc, char **argv) { @@ -178,7 +216,9 @@ {"xstats", 0, NULL, 0}, {"metrics", 0, NULL, 0}, {"xstats-reset", 0, NULL, 0}, + {"xstats-name", required_argument, NULL, 1}, {"collectd-format", 0, NULL, 0}, + {"xstats-ids", 1, NULL, 1}, {"host-id", 0, NULL, 0}, {NULL, 0, 0, 0} }; @@ -224,7 +264,28 @@ MAX_LONG_OPT_SZ)) reset_xstats = 1; break; + case 1: + /* Print xstat single value given by name*/ + if (!strncmp(long_option[option_index].name, + "xstats-name", MAX_LONG_OPT_SZ)) { + enable_xstats_name = 1; + xstats_name = optarg; + printf("name:%s:%s\n", + long_option[option_index].name, + optarg); + } else if (!strncmp(long_option[option_index].name, + "xstats-ids", + MAX_LONG_OPT_SZ)) { + nb_xstats_ids = parse_xstats_ids(optarg, + xstats_ids, MAX_NB_XSTATS_IDS); + + if (nb_xstats_ids <= 0) { + printf("xstats-id list parse error.\n"); + return -1; + } + } + break; default: proc_info_usage(prgname); return -1; @@ -351,20 +412,82 @@ static void collectd_resolve_cnt_type(char *cnt_type, size_t cnt_type_len, } static void +nic_xstats_by_name_display(uint8_t port_id, char *name) +{ + uint64_t id; + + printf("###### NIC statistics for port %-2d, statistic name '%s':\n", + port_id, name); + + if (rte_eth_xstats_get_id_by_name(port_id, name, &id) == 0) + printf("%s: %"PRIu64"\n", name, id); + else + printf("Statistic not found...\n"); + +} + +static void +nic_xstats_by_ids_display(uint8_t port_id, uint64_t *ids, int len) +{ + struct rte_eth_xstat_name *xstats_names; + uint64_t *values; + int ret, i; + static const char *nic_stats_border = "########################"; + + values = malloc(sizeof(values) * len); + if (values == NULL) { + printf("Cannot allocate memory for xstats\n"); + return; + } + + xstats_names = malloc(sizeof(struct rte_eth_xstat_name) * len); + if (xstats_names == NULL) { + printf("Cannot allocate memory for xstat names\n"); + free(values); + return; + } + + if (len != rte_eth_xstats_get_names( + port_id, xstats_names, len, ids)) { + printf("Cannot get xstat names\n"); + goto err; + } + + printf("###### NIC extended statistics for port %-2d #########\n", + port_id); + printf("%s############################\n", nic_stats_border); + ret = rte_eth_xstats_get(port_id, ids, values, len); + if (ret < 0 || ret > len) { + printf("Cannot get xstats\n"); + goto err; + } + + for (i = 0; i < len; i++) + printf("%s: %"PRIu64"\n", + xstats_names[i].name, + values[i]); + + printf("%s############################\n", nic_stats_border); +err: + free(values); + free(xstats_names); +} + +static void nic_xstats_display(uint8_t port_id) { struct rte_eth_xstat_name *xstats_names; - struct rte_eth_xstat *xstats; + uint64_t *values; int len, ret, i; static const char *nic_stats_border = "########################"; - len = rte_eth_xstats_get_names_all(port_id, NULL, 0); + len = rte_eth_xstats_get_names(port_id, NULL, 0, NULL); if (len < 0) { printf("Cannot get xstats count\n"); return; } - xstats = malloc(sizeof(xstats[0]) * len); - if (xstats == NULL) { + values = malloc(sizeof(values) * len); + if (values == NULL) { printf("Cannot allocate memory for xstats\n"); return; } @@ -372,11 +495,11 @@ static void collectd_resolve_cnt_type(char *cnt_type, size_t cnt_type_len, xstats_names = malloc(sizeof(struct rte_eth_xstat_name) * len); if (xstats_names == NULL) { printf("Cannot allocate memory for xstat names\n"); - free(xstats); + free(values); return; } - if (len != rte_eth_xstats_get_names_all( - port_id, xstats_names, len)) { + if (len != rte_eth_xstats_get_names( + port_id, xstats_names, len, NULL)) { printf("Cannot get xstat names\n"); goto err; } @@ -385,7 +508,7 @@ static void collectd_resolve_cnt_type(char *cnt_type, size_t cnt_type_len, port_id); printf("%s############################\n", nic_stats_border); - ret = rte_eth_xstats_get_all(port_id, xstats, len); + ret = rte_eth_xstats_get(port_id, NULL, values, len); if (ret < 0 || ret > len) { printf("Cannot get xstats\n"); goto err; @@ -401,18 +524,18 @@ static void collectd_resolve_cnt_type(char *cnt_type, size_t cnt_type_len, xstats_names[i].name); sprintf(buf, "PUTVAL %s/dpdkstat-port.%u/%s-%s N:%" PRIu64"\n", host_id, port_id, counter_type, - xstats_names[i].name, xstats[i].value); + xstats_names[i].name, values[i]); write(stdout_fd, buf, strlen(buf)); } else { printf("%s: %"PRIu64"\n", xstats_names[i].name, - xstats[i].value); + values[i]); } } printf("%s############################\n", nic_stats_border); err: - free(xstats); + free(values); free(xstats_names); } @@ -551,6 +674,11 @@ static void collectd_resolve_cnt_type(char *cnt_type, size_t cnt_type_len, nic_stats_clear(i); else if (reset_xstats) nic_xstats_clear(i); + else if (enable_xstats_name) + nic_xstats_by_name_display(i, xstats_name); + else if (nb_xstats_ids > 0) + nic_xstats_by_ids_display(i, xstats_ids, + nb_xstats_ids); else if (enable_metrics) metrics_display(i); } diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index ef30883..0653cf7 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -1809,7 +1809,7 @@ struct rte_eth_dev * rte_eth_xstats_get(uint8_t port_id, uint64_t *ids, uint64_t *values, unsigned int n), rte_eth_xstats_get_v1705); -int +__rte_deprecated int rte_eth_xstats_get_all(uint8_t port_id, struct rte_eth_xstat *xstats, unsigned int n) { @@ -1832,7 +1832,7 @@ struct rte_eth_dev * return size; } -int +__rte_deprecated int rte_eth_xstats_get_names_all(uint8_t port_id, struct rte_eth_xstat_name *xstats_names, unsigned int n) { diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 058c435..c6a40ed 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -2389,6 +2389,7 @@ int rte_eth_xstats_get_id_by_name(uint8_t port_id, const char *xstat_name, * shall not be used by the caller. * - A negative value on error (invalid port id). */ +__rte_deprecated int rte_eth_xstats_get_all(uint8_t port_id, struct rte_eth_xstat *xstats, unsigned int n); @@ -2412,6 +2413,7 @@ int rte_eth_xstats_get_all(uint8_t port_id, struct rte_eth_xstat *xstats, * shall not be used by the caller. * - A negative value on error (invalid port id). */ +__rte_deprecated int rte_eth_xstats_get_names_all(uint8_t port_id, struct rte_eth_xstat_name *xstats_names, unsigned int n);