From patchwork Thu Jul 12 07:55:46 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Li, Xiaoyun" X-Patchwork-Id: 42945 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 D06BF1B51E; Thu, 12 Jul 2018 10:08:40 +0200 (CEST) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id 5F00C1B1EF; Thu, 12 Jul 2018 10:08:38 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 12 Jul 2018 01:08:36 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,342,1526367600"; d="scan'208";a="66303486" Received: from dpdk-lixiaoyun.sh.intel.com ([10.67.110.193]) by fmsmga002.fm.intel.com with ESMTP; 12 Jul 2018 01:08:24 -0700 From: Xiaoyun Li To: qi.z.zhang@intel.com, wenzhuo.lu@intel.com Cc: dev@dpdk.org, Xiaoyun Li , stable@dpdk.org Date: Thu, 12 Jul 2018 15:55:46 +0800 Message-Id: <1531382146-13819-1-git-send-email-xiaoyun.li@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1531275335-29234-1-git-send-email-xiaoyun.li@intel.com> References: <1531275335-29234-1-git-send-email-xiaoyun.li@intel.com> Subject: [dpdk-dev] [PATCH v3] app/testpmd: fix little perf drop 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 about 3% perf drop. And it is because of a bitrate calculation in the datapath. So improve it by maintaining an array of port indexes in testpmd, which is updated with ethdev events. Fixes: 8728ccf37615 ("fix ethdev ports enumeration") Cc: stable@dpdk.org Signed-off-by: Xiaoyun Li Acked-by: Wenzhuo Lu --- v3: * Modify the commit log and patch name. v2: * Update ports_ids when user attach or detach a port. --- app/test-pmd/testpmd.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index dde7d43..e4f39be 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -127,6 +127,8 @@ portid_t nb_ports; /**< Number of probed ethernet ports. */ struct fwd_lcore **fwd_lcores; /**< For all probed logical cores. */ lcoreid_t nb_lcores; /**< Number of probed logical cores. */ +portid_t ports_ids[RTE_MAX_ETHPORTS]; /**< Store all port ids. */ + /* * Test Forwarding Configuration. * nb_fwd_lcores <= nb_cfg_lcores <= nb_lcores @@ -1147,8 +1149,9 @@ run_pkt_fwd_on_lcore(struct fwd_lcore *fc, packet_fwd_t pkt_fwd) uint64_t tics_per_1sec; uint64_t tics_datum; uint64_t tics_current; - uint16_t idx_port; + uint16_t i, cnt_ports; + cnt_ports = nb_ports; tics_datum = rte_rdtsc(); tics_per_1sec = rte_get_timer_hz(); #endif @@ -1163,9 +1166,9 @@ run_pkt_fwd_on_lcore(struct fwd_lcore *fc, packet_fwd_t pkt_fwd) tics_current = rte_rdtsc(); if (tics_current - tics_datum >= tics_per_1sec) { /* Periodic bitrate calculation */ - RTE_ETH_FOREACH_DEV(idx_port) + for (i = 0; i < cnt_ports; i++) rte_stats_bitrate_calc(bitrate_data, - idx_port); + ports_ids[i]); tics_datum = tics_current; } } @@ -1968,6 +1971,7 @@ attach_port(char *identifier) reconfig(pi, socket_id); rte_eth_promiscuous_enable(pi); + ports_ids[nb_ports] = pi; nb_ports = rte_eth_dev_count_avail(); ports[pi].port_status = RTE_PORT_STOPPED; @@ -1982,6 +1986,7 @@ void detach_port(portid_t port_id) { char name[RTE_ETH_NAME_MAX_LEN]; + uint16_t i; printf("Detaching a port...\n"); @@ -1998,6 +2003,13 @@ detach_port(portid_t port_id) return; } + for (i = 0; i < nb_ports; i++) { + if (ports_ids[i] == port_id) { + ports_ids[i] = ports_ids[nb_ports-1]; + ports_ids[nb_ports-1] = 0; + break; + } + } nb_ports = rte_eth_dev_count_avail(); update_fwd_ports(RTE_MAX_ETHPORTS); @@ -2649,6 +2661,7 @@ main(int argc, char** argv) { int diag; portid_t port_id; + uint16_t count; int ret; signal(SIGINT, signal_handler); @@ -2668,7 +2681,12 @@ main(int argc, char** argv) rte_pdump_init(NULL); #endif - nb_ports = (portid_t) rte_eth_dev_count_avail(); + count = 0; + RTE_ETH_FOREACH_DEV(port_id) { + ports_ids[count] = port_id; + count++; + } + nb_ports = (portid_t) count; if (nb_ports == 0) TESTPMD_LOG(WARNING, "No probed ethernet devices\n");