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 90748A04A5; Wed, 17 Jun 2020 17:16:36 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 877F02BF4; Wed, 17 Jun 2020 17:16:35 +0200 (CEST) Received: from mail-io1-f67.google.com (mail-io1-f67.google.com [209.85.166.67]) by dpdk.org (Postfix) with ESMTP id B6A971023; Wed, 17 Jun 2020 17:16:33 +0200 (CEST) Received: by mail-io1-f67.google.com with SMTP id w18so3144168iom.5; Wed, 17 Jun 2020 08:16:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=VU05SSUAsWjULX7xwtjIoXNah759yBQIykl9hpa+dvM=; b=YXdyTfvvtlJqvgAsaCWk/kSKpnnUn1NCIr6PcClX+C1ZkMkXGMhgr+XrN3pj+S0dC1 EIA3oQs7ppAYSyD3Z5YglE+5rFAZsTSiDynFrms0RFfc2DALxI60WwSbm+8OiwVttRNA owSRBiM6fymfCpPjPKg9UPOcgm3mksngyBTrev5pxPmhYlCr3q2NEvXEWevqdDoQWT/a SDSlDSrk7q7nEtsmXEKNdIvH7WloZkZ/ePLgvMf4eGOpk6ddjA72MDvu935Ebu684DwQ 8Q/6S9vpO/lmUop5yAEzg6bXP8ia+zHnEUs0+BHVuikN6O2W0puaHrJsf+gTjGXMMIS9 Nlpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=VU05SSUAsWjULX7xwtjIoXNah759yBQIykl9hpa+dvM=; b=g+ABr1hhVKErQfFpaf8QyUQ2TxnfIVqNLiDkqD6cE781BNMCqVqheDJNOabBuF6lIe c4VdoddsKvN4XVQLUjQyuPe06bnXuXgxCMOQ7Nc45JlNWU2kS55u2kZt+XzMOUtqR7Oe wN9fJiY1ZAcuuFZWAwMFHqFjMrkCgOXLHOy1DGRF4ZpFf9bfpm5oRUigslzv2IU14xG/ 2yDRplIJH5CJU0OAmaKnv1PmrVQa0/d6COqYdUXtn0z2Ov/zbMS7Ny1zUsUGzQXDbsgE oYfjLwGg7v/Bx6GS2PrmyyfDP77df2SxFh7m5hyOcEPpa8t4na7kTHFAiMnfwyhAanMu Pbxg== X-Gm-Message-State: AOAM532pN2LRf+6JV29pJGvtqwvCbDvYFPVsugWGiF9XWyNjLx9YD1UN qfVVIXdlBOGMin+GAIBleP7B6bCu1xOUbh1RF3c= X-Google-Smtp-Source: ABdhPJx0iHy3G+B5QapYfl/r3s5SIK73sf9Fc4WO/M5C05bVb0T6YPYzaw+k5kp5AHTs0CLXp7CQFP7sNDKAAGlGDbs= X-Received: by 2002:a05:6602:2dca:: with SMTP id l10mr8562755iow.163.1592406993006; Wed, 17 Jun 2020 08:16:33 -0700 (PDT) MIME-Version: 1.0 References: <20200617144307.9961-1-honnappa.nagarahalli@arm.com> In-Reply-To: <20200617144307.9961-1-honnappa.nagarahalli@arm.com> From: Jerin Jacob Date: Wed, 17 Jun 2020 20:46:16 +0530 Message-ID: To: Honnappa Nagarahalli Cc: dpdk-dev , Ali Alnubani , orgerlitz@mellanox.com, Wenzhuo Lu , Beilei Xing , Bernard Iremonger , Hemant Agrawal , Jerin Jacob , Slava Ovsiienko , Thomas Monjalon , "Ruifeng Wang (Arm Technology China)" , Phil Yang , nd , Zhihong Wang , dpdk stable Content-Type: text/plain; charset="UTF-8" Subject: Re: [dpdk-dev] [PATCH 1/5] app/testpmd: clock gettime call in throughput calculation 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" On Wed, Jun 17, 2020 at 8:13 PM Honnappa Nagarahalli wrote: > > The throughput calculation requires a counter that measures > passing of time. The PMU cycle counter does not do that. This It is not clear from git commit on why PMU cycle counter does not do that? On dpdk bootup, we are figuring out the Hz value based on PMU counter cycles. What is the missing piece here? IMO, PMU counter should have less latency and more granularity than clock_getime. > results in incorrect throughput numbers when > RTE_ARM_EAL_RDTSC_USE_PMU is enabled. 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") > Cc: zhihong.wang@intel.com > Cc: stable@dpdk.org > > Signed-off-by: Honnappa Nagarahalli > Reviewed-by: Phil Yang > Reviewed-by: Ruifeng Wang > --- > 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 016bcb09c..91fbf99f8 100644 > --- a/app/test-pmd/config.c > +++ b/app/test-pmd/config.c > @@ -54,6 +54,14 @@ > > #define ETHDEV_FWVERS_LEN 32 > > +#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 { > @@ -136,9 +144,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]; > @@ -195,10 +204,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; > @@ -206,10 +222,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; > @@ -217,10 +233,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.17.1 >