From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id EFBA3A0518 for ; Fri, 24 Jul 2020 14:08:37 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E74891C039; Fri, 24 Jul 2020 14:08:37 +0200 (CEST) Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by dpdk.org (Postfix) with ESMTP id 009BC1C1C1 for ; Fri, 24 Jul 2020 14:08:37 +0200 (CEST) Received: by mail-wr1-f66.google.com with SMTP id f7so8109815wrw.1 for ; Fri, 24 Jul 2020 05:08:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=lwy2GwKj80Phqic+p3zG6oXatJYy4Xo1Kks53MRLgl8=; b=ic9g2foRFWMP8lLUg881P/3NI3JNhEO5EpoYMo3AwJfX5xKB8EaOIfbVTqv07K18ao Wq3QGlBrTdJSNmwZxxqfg4VRUkdiaCqZp0QwPq3CFTuPNsTddvM58JnXDrIYYcZVYsXK 48av3p4bR5xY1vmLs17HY9PymM3SDs+I8mttTsnDWCNU5M7YjJS3rtSi5RSj1njDbXP4 vGIxYOGRx6fTdlgk/quf5O6/ktxCb3dKyz7D0nJL5vGU6734P5fxYAzNX19i2JbP0wVb JTASL4P9N0nGfiiUGZf+gTlHAESLtG4pOe7LsrwIYKGJbys91KfKd0oxEEv2GslHWSz1 r2ZA== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=lwy2GwKj80Phqic+p3zG6oXatJYy4Xo1Kks53MRLgl8=; b=h9z40u+6SwhQrDAKiLJ59/sCq3qqj6aV0swyCSmq8GNTzIs5i/bugpoug9XWL40L3v 4LB4FSt8DKq063sPENxwfGfEK3fyOATMoglUhsyFQrJGdzyvy1eOprCBQXeybJLxtLJT UMw7UoupVlTT3ZQSjBBogh2NXIEqQK3SlPcT1qkxDmSW/TiAffdXd6bwhahK0Fsz465C 0TbCoTiqUQ9RoEWHE+jLdzqU8UDPfobdG7lH55wL6/5B8mJeTyjGlGNZpfYTozymkVXx gYIB+Svml86vvm7Fm5N0UCO8jOsCQPvsKYRB1eNqpv+Pyy9gNUK4tz7YINI7BfNcRfko U9AQ== X-Gm-Message-State: AOAM530o4R5JBgu8RHkPxeu7JU2xMDYnb7ZUY/Mi3ThmHtgLP5Turtb5 iVlw4tJWlOsKg1Dd8itOW/o= X-Google-Smtp-Source: ABdhPJyKYBEIFkXtmdC3GqezWmx3qNHg+pWftaj97T41VkgRgu0N9ujRDTgXNKjcZQYl+yPrTscwxg== X-Received: by 2002:adf:81c5:: with SMTP id 63mr3956979wra.185.1595592516674; Fri, 24 Jul 2020 05:08:36 -0700 (PDT) Received: from localhost ([88.98.246.218]) by smtp.gmail.com with ESMTPSA id o7sm1065394wrv.50.2020.07.24.05.08.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2020 05:08:35 -0700 (PDT) From: luca.boccassi@gmail.com To: Honnappa Nagarahalli Cc: Phil Yang , Ruifeng Wang , Ferruh Yigit , Ali Alnubani , dpdk stable Date: Fri, 24 Jul 2020 12:59:18 +0100 Message-Id: <20200724120030.1863487-120-luca.boccassi@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200724120030.1863487-1-luca.boccassi@gmail.com> References: <20200724120030.1863487-1-luca.boccassi@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-stable] patch 'app/testpmd: use clock time in throughput calculation' has been queued to stable release 19.11.4 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Sender: "stable" Hi, FYI, your patch has been queued to stable release 19.11.4 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 07/26/20. So please shout if anyone has objections. Also note that after the patch there's a diff of the upstream commit vs the patch applied to the branch. This will indicate if there was any rebasing needed to apply to the stable branch. If there were code changes for rebasing (ie: not only metadata diffs), please double check that the rebase was correctly done. Thanks. Luca Boccassi --- >From e3481fb27c70b9d5fb50f95c9545e99e31dcc40c Mon Sep 17 00:00:00 2001 From: Honnappa Nagarahalli Date: Mon, 6 Jul 2020 18:32:29 -0500 Subject: [PATCH] app/testpmd: use clock time in throughput calculation [ upstream commit aac2b6a78d7728ee39aed8822cba102b3a99a6bf ] The throughput calculation requires a counter that measures passing of time. However, the kernel saves and restores the PMU state when a thread is unscheduled and scheduled. This ensures that the PMU cycles are not counted towards a thread that is not scheduled. Hence, when RTE_ARM_EAL_RDTSC_USE_PMU is enabled, the PMU cycles do not represent the passing of time. This results in incorrect calculation of throughput numbers. Use clock_gettime system call to calculate the time passed since last call. Bugzilla ID: 450 Fixes: 0e106980301d ("app/testpmd: show throughput in port stats") Signed-off-by: Honnappa Nagarahalli Reviewed-by: Phil Yang Reviewed-by: Ruifeng Wang Reviewed-by: Ferruh Yigit Tested-by: Phil Yang Tested-by: Ali Alnubani --- app/test-pmd/config.c | 44 +++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index e345cea6d..726a26342 100644 --- a/app/test-pmd/config.c +++ b/app/test-pmd/config.c @@ -53,6 +53,14 @@ #include "testpmd.h" +#ifdef CLOCK_MONOTONIC_RAW /* Defined in glibc bits/time.h */ +#define CLOCK_TYPE_ID CLOCK_MONOTONIC_RAW +#else +#define CLOCK_TYPE_ID CLOCK_MONOTONIC +#endif + +#define NS_PER_SEC 1E9 + static char *flowtype_to_str(uint16_t flow_type); static const struct { @@ -125,9 +133,10 @@ nic_stats_display(portid_t port_id) static uint64_t prev_pkts_tx[RTE_MAX_ETHPORTS]; static uint64_t prev_bytes_rx[RTE_MAX_ETHPORTS]; static uint64_t prev_bytes_tx[RTE_MAX_ETHPORTS]; - static uint64_t prev_cycles[RTE_MAX_ETHPORTS]; + static uint64_t prev_ns[RTE_MAX_ETHPORTS]; + struct timespec cur_time; uint64_t diff_pkts_rx, diff_pkts_tx, diff_bytes_rx, diff_bytes_tx, - diff_cycles; + diff_ns; uint64_t mpps_rx, mpps_tx, mbps_rx, mbps_tx; struct rte_eth_stats stats; struct rte_port *port = &ports[port_id]; @@ -184,10 +193,17 @@ nic_stats_display(portid_t port_id) } } - diff_cycles = prev_cycles[port_id]; - prev_cycles[port_id] = rte_rdtsc(); - if (diff_cycles > 0) - diff_cycles = prev_cycles[port_id] - diff_cycles; + diff_ns = 0; + if (clock_gettime(CLOCK_TYPE_ID, &cur_time) == 0) { + uint64_t ns; + + ns = cur_time.tv_sec * NS_PER_SEC; + ns += cur_time.tv_nsec; + + if (prev_ns[port_id] != 0) + diff_ns = ns - prev_ns[port_id]; + prev_ns[port_id] = ns; + } diff_pkts_rx = (stats.ipackets > prev_pkts_rx[port_id]) ? (stats.ipackets - prev_pkts_rx[port_id]) : 0; @@ -195,10 +211,10 @@ nic_stats_display(portid_t port_id) (stats.opackets - prev_pkts_tx[port_id]) : 0; prev_pkts_rx[port_id] = stats.ipackets; prev_pkts_tx[port_id] = stats.opackets; - mpps_rx = diff_cycles > 0 ? - diff_pkts_rx * rte_get_tsc_hz() / diff_cycles : 0; - mpps_tx = diff_cycles > 0 ? - diff_pkts_tx * rte_get_tsc_hz() / diff_cycles : 0; + mpps_rx = diff_ns > 0 ? + (double)diff_pkts_rx / diff_ns * NS_PER_SEC : 0; + mpps_tx = diff_ns > 0 ? + (double)diff_pkts_tx / diff_ns * NS_PER_SEC : 0; diff_bytes_rx = (stats.ibytes > prev_bytes_rx[port_id]) ? (stats.ibytes - prev_bytes_rx[port_id]) : 0; @@ -206,10 +222,10 @@ nic_stats_display(portid_t port_id) (stats.obytes - prev_bytes_tx[port_id]) : 0; prev_bytes_rx[port_id] = stats.ibytes; prev_bytes_tx[port_id] = stats.obytes; - mbps_rx = diff_cycles > 0 ? - diff_bytes_rx * rte_get_tsc_hz() / diff_cycles : 0; - mbps_tx = diff_cycles > 0 ? - diff_bytes_tx * rte_get_tsc_hz() / diff_cycles : 0; + mbps_rx = diff_ns > 0 ? + (double)diff_bytes_rx / diff_ns * NS_PER_SEC : 0; + mbps_tx = diff_ns > 0 ? + (double)diff_bytes_tx / diff_ns * NS_PER_SEC : 0; printf("\n Throughput (since last show)\n"); printf(" Rx-pps: %12"PRIu64" Rx-bps: %12"PRIu64"\n Tx-pps: %12" -- 2.20.1 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2020-07-24 12:53:53.167374596 +0100 +++ 0120-app-testpmd-use-clock-time-in-throughput-calculation.patch 2020-07-24 12:53:48.407008695 +0100 @@ -1,8 +1,10 @@ -From aac2b6a78d7728ee39aed8822cba102b3a99a6bf Mon Sep 17 00:00:00 2001 +From e3481fb27c70b9d5fb50f95c9545e99e31dcc40c Mon Sep 17 00:00:00 2001 From: Honnappa Nagarahalli Date: Mon, 6 Jul 2020 18:32:29 -0500 Subject: [PATCH] app/testpmd: use clock time in throughput calculation +[ upstream commit aac2b6a78d7728ee39aed8822cba102b3a99a6bf ] + The throughput calculation requires a counter that measures passing of time. However, the kernel saves and restores the PMU state when a thread is unscheduled and scheduled. This ensures @@ -15,7 +17,6 @@ Bugzilla ID: 450 Fixes: 0e106980301d ("app/testpmd: show throughput in port stats") -Cc: stable@dpdk.org Signed-off-by: Honnappa Nagarahalli Reviewed-by: Phil Yang @@ -28,12 +29,12 @@ 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c -index a79019f52..75013100f 100644 +index e345cea6d..726a26342 100644 --- a/app/test-pmd/config.c +++ b/app/test-pmd/config.c -@@ -54,6 +54,14 @@ +@@ -53,6 +53,14 @@ - #define ETHDEV_FWVERS_LEN 32 + #include "testpmd.h" +#ifdef CLOCK_MONOTONIC_RAW /* Defined in glibc bits/time.h */ +#define CLOCK_TYPE_ID CLOCK_MONOTONIC_RAW @@ -46,7 +47,7 @@ static char *flowtype_to_str(uint16_t flow_type); static const struct { -@@ -139,9 +147,10 @@ nic_stats_display(portid_t port_id) +@@ -125,9 +133,10 @@ nic_stats_display(portid_t port_id) static uint64_t prev_pkts_tx[RTE_MAX_ETHPORTS]; static uint64_t prev_bytes_rx[RTE_MAX_ETHPORTS]; static uint64_t prev_bytes_tx[RTE_MAX_ETHPORTS]; @@ -59,7 +60,7 @@ uint64_t mpps_rx, mpps_tx, mbps_rx, mbps_tx; struct rte_eth_stats stats; struct rte_port *port = &ports[port_id]; -@@ -198,10 +207,17 @@ nic_stats_display(portid_t port_id) +@@ -184,10 +193,17 @@ nic_stats_display(portid_t port_id) } } @@ -81,7 +82,7 @@ diff_pkts_rx = (stats.ipackets > prev_pkts_rx[port_id]) ? (stats.ipackets - prev_pkts_rx[port_id]) : 0; -@@ -209,10 +225,10 @@ nic_stats_display(portid_t port_id) +@@ -195,10 +211,10 @@ nic_stats_display(portid_t port_id) (stats.opackets - prev_pkts_tx[port_id]) : 0; prev_pkts_rx[port_id] = stats.ipackets; prev_pkts_tx[port_id] = stats.opackets; @@ -96,7 +97,7 @@ diff_bytes_rx = (stats.ibytes > prev_bytes_rx[port_id]) ? (stats.ibytes - prev_bytes_rx[port_id]) : 0; -@@ -220,10 +236,10 @@ nic_stats_display(portid_t port_id) +@@ -206,10 +222,10 @@ nic_stats_display(portid_t port_id) (stats.obytes - prev_bytes_tx[port_id]) : 0; prev_bytes_rx[port_id] = stats.ibytes; prev_bytes_tx[port_id] = stats.obytes;