From patchwork Thu Jun 7 08:15:23 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Marchand X-Patchwork-Id: 40706 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 52F901B024; Thu, 7 Jun 2018 10:15:30 +0200 (CEST) Received: from mail-wm0-f67.google.com (mail-wm0-f67.google.com [74.125.82.67]) by dpdk.org (Postfix) with ESMTP id 0FA6E1B01F for ; Thu, 7 Jun 2018 10:15:29 +0200 (CEST) Received: by mail-wm0-f67.google.com with SMTP id q4-v6so2044022wmq.1 for ; Thu, 07 Jun 2018 01:15:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=GRF16dw8rzOhD9TzpVWWhu8G8+lqsfdIUPnaaQ4qwUc=; b=uXyY8lAj2DJoUMn8ZPzll3tkSEOVhItmscavdhIRFzEAp7eMqXp2pvw/fIcvT7g9W/ lYkPn5s9Vlb4H96tUsE8lShDlKMKyOwJBnYNAotBMdsm4Wp/nCTncYITdtFbYRYYhfaT d0miOg1xVfbaMJ4MhYiccd3vpsJRfGO0Yc61O1u5LttoI6vzzxwdrOpyy0qzhATvK1U8 ioD75QedF11CtFcq9EFzD7IAif+C5kUR4RP+CO66N57qOoIRRNs5TZVhF7fqZebOPFZw IHCzfeVw/Cp0P1asiGYKqiKD0m1ojHXNb8Nx8X/0M+1+evgYjFEptTalDagM5Hu2FIFz ZL7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=GRF16dw8rzOhD9TzpVWWhu8G8+lqsfdIUPnaaQ4qwUc=; b=mvSHcWeZ/dy6qeIZhK/nAT60aQ5KiUg7sdAUSwZr9qmnnNv7vpVw6bkTMi35/CNdIL yYz3c2Y8pb9iF9L0Pc4R/vGRyOyMD2vbmCvLHhstrkYgDo9XHbQA+nAV0v/Zwbk+Q0Bn HQnONjgIhS7yNTHtfhUIQKQRRgeO7H/eKKRms1pOfIelmpmjwtgm0BzU0HTbuiNHdB1W 1jvWeGtC6C19K6akZ3c7tcHaySFy4keaX1bdjzHCPxNtt126OPDduM2jGrpi0eH4Klih s6SwiMMdcRHzOgeKr8t56Y0cPlZNPIsNNhPdSg0yeLM6cGAN68S5H0iNG0kzbEODgiQ0 t8VA== X-Gm-Message-State: APt69E0Jmsk+0cZ4MZRVZ9tzzgO7nvVxazbE2+6Jxr2XViA8jw8Qu1WC SAyoVxyMcLWSQEZCZVYajemwAg2gJ/Y= X-Google-Smtp-Source: ADUXVKJWbdnzI7p77pmdqfdquteWvQHx18JRlCzzkWDzaaUopT991xVTI7q5DbsjC6VSfY7fcXPZEg== X-Received: by 2002:a1c:d70c:: with SMTP id o12-v6mr788839wmg.71.1528359328443; Thu, 07 Jun 2018 01:15:28 -0700 (PDT) Received: from 6wind.com ([2a01:cb19:142:1800:b9d8:f16f:434d:6cba]) by smtp.gmail.com with ESMTPSA id c53-v6sm64283319wrg.12.2018.06.07.01.15.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 07 Jun 2018 01:15:27 -0700 (PDT) From: David Marchand To: dev@dpdk.org Cc: wenzhuo.lu@intel.com, jingjing.wu@intel.com, bernard.iremonger@intel.com, remy.horton@intel.com, stable@dpdk.org Date: Thu, 7 Jun 2018 10:15:23 +0200 Message-Id: <1528359323-22885-1-git-send-email-david.marchand@6wind.com> X-Mailer: git-send-email 2.7.4 Subject: [dpdk-dev] [PATCH] app/testpmd: add sanity checks when retrieving xstats 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" Testpmd should not expect the xstats names and values arrays to be aligned: neither the arrays sizes, nor the order in which the values are. This hid some bugs where pmds would either return wrong values count or invalid statistics indexes. Link: http://dpdk.org/browse/dpdk/commit/?id=5fd4d049692b2fde8bf49c7461b18180a8fd2545 Link: http://dpdk.org/dev/patchwork/patch/40705/ Signed-off-by: David Marchand Acked-by: Remy Horton --- @stable: when this goes in, I recommend backporting this to all existing branches, as it makes it easier to show this kind of pmds bugs. --- app/test-pmd/config.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index 97020fb..8edb80c 100644 --- a/app/test-pmd/config.c +++ b/app/test-pmd/config.c @@ -210,9 +210,11 @@ nic_stats_clear(portid_t port_id) void nic_xstats_display(portid_t port_id) { - struct rte_eth_xstat *xstats; - int cnt_xstats, idx_xstat; struct rte_eth_xstat_name *xstats_names; + struct rte_eth_xstat *xstats; + int cnt_xnames; + int cnt_xstats; + int idx_xstat; printf("###### NIC extended statistics for port %-2d\n", port_id); if (!rte_eth_dev_is_valid_port(port_id)) { @@ -221,33 +223,34 @@ nic_xstats_display(portid_t port_id) } /* Get count */ - cnt_xstats = rte_eth_xstats_get_names(port_id, NULL, 0); - if (cnt_xstats < 0) { + cnt_xnames = rte_eth_xstats_get_names(port_id, NULL, 0); + if (cnt_xnames < 0) { printf("Error: Cannot get count of xstats\n"); return; } /* Get id-name lookup table */ - xstats_names = malloc(sizeof(struct rte_eth_xstat_name) * cnt_xstats); + xstats_names = malloc(sizeof(struct rte_eth_xstat_name) * cnt_xnames); if (xstats_names == NULL) { printf("Cannot allocate memory for xstats lookup\n"); return; } - if (cnt_xstats != rte_eth_xstats_get_names( - port_id, xstats_names, cnt_xstats)) { + if (cnt_xnames != rte_eth_xstats_get_names( + port_id, xstats_names, cnt_xnames)) { printf("Error: Cannot get xstats lookup\n"); free(xstats_names); return; } /* Get stats themselves */ - xstats = malloc(sizeof(struct rte_eth_xstat) * cnt_xstats); + xstats = malloc(sizeof(struct rte_eth_xstat) * cnt_xnames); if (xstats == NULL) { printf("Cannot allocate memory for xstats\n"); free(xstats_names); return; } - if (cnt_xstats != rte_eth_xstats_get(port_id, xstats, cnt_xstats)) { + cnt_xstats = rte_eth_xstats_get(port_id, xstats, cnt_xnames); + if (cnt_xstats > cnt_xnames) { printf("Error: Unable to get xstats\n"); free(xstats_names); free(xstats); @@ -256,10 +259,15 @@ nic_xstats_display(portid_t port_id) /* Display xstats */ for (idx_xstat = 0; idx_xstat < cnt_xstats; idx_xstat++) { + if (xstats[idx_xstat].id > (uint64_t)cnt_xnames) { + printf("Error: Invalid statistic index: %"PRId64 + ", max %d\n", xstats[idx_xstat].id, cnt_xnames); + continue; + } if (xstats_hide_zero && !xstats[idx_xstat].value) continue; printf("%s: %"PRIu64"\n", - xstats_names[idx_xstat].name, + xstats_names[xstats[idx_xstat].id].name, xstats[idx_xstat].value); } free(xstats_names);