From patchwork Sun Jun 30 16:21:11 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gavin Hu X-Patchwork-Id: 55668 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 D15477CBC; Sun, 30 Jun 2019 18:21:41 +0200 (CEST) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by dpdk.org (Postfix) with ESMTP id 34E785689 for ; Sun, 30 Jun 2019 18:21:40 +0200 (CEST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 4832B344; Sun, 30 Jun 2019 09:21:39 -0700 (PDT) Received: from net-arm-thunderx2.shanghai.arm.com (net-arm-thunderx2.shanghai.arm.com [10.169.40.40]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 6317F3F718; Sun, 30 Jun 2019 09:21:37 -0700 (PDT) From: Gavin Hu To: dev@dpdk.org Cc: thomas@monjalon.net, jerinj@marvell.com, hemant.agrawal@nxp.com, bruce.richardson@intel.com, chaozhu@linux.vnet.ibm.com, Honnappa.Nagarahalli@arm.com, nd@arm.com, gavin.hu@arm.com Date: Mon, 1 Jul 2019 00:21:11 +0800 Message-Id: <1561911676-37718-1-git-send-email-gavin.hu@arm.com> X-Mailer: git-send-email 2.7.4 Subject: [dpdk-dev] [RFC 0/5] use WFE for locks and ring on aarch64 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" DPDK has multiple use cases where the core repeatedly polls a location in memory. This polling results in many cache and memory transactions. Arm architecture provides WFE (Wait For Event) instruction, which allows the cpu core to enter a low power state until woken up by the update to the memory location being polled. Thus reducing the cache and memory transactions. x86 has the PAUSE hint instruction to reduce such overhead. The rte_wait_until_equal_xxx APIs abstract the functionality of 'polling for a memory location to become equal to a given value'. For non-Arm platforms, these APIs are just wrappers around do-while loop with rte_pause, so there are no performance differences. For Arm platforms, use of WFE can be configured using CONFIG_RTE_USE_WFE option. It is disabled by default. Currently, use of WFE is supported only for aarch64 platforms. armv7 platforms do support the WFE instruction, but they require explicit wake up events(sev) and are less performannt. Testing shows that, performance varies across different platforms, with some showing degradation. CONFIG_RTE_USE_WFE should be enabled depending on the performance on the target platforms. Gavin Hu (5): eal: add the APIs to wait until equal ticketlock: use new API to reduce contention on aarch64 ring: use wfe to wait for ring tail update on aarch64 spinlock: use wfe to reduce contention on aarch64 config: add WFE config entry for aarch64 config/arm/meson.build | 1 + config/common_armv8a_linux | 6 + .../common/include/arch/arm/rte_pause_64.h | 143 +++++++++++++++++++++ .../common/include/arch/arm/rte_spinlock.h | 25 ++++ lib/librte_eal/common/include/generic/rte_pause.h | 20 +++ .../common/include/generic/rte_spinlock.h | 2 +- .../common/include/generic/rte_ticketlock.h | 4 +- lib/librte_ring/rte_ring_c11_mem.h | 5 +- lib/librte_ring/rte_ring_generic.h | 4 +- 9 files changed, 203 insertions(+), 7 deletions(-)