From patchwork Fri Apr 19 13:53:22 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Andrew Jones X-Patchwork-Id: 13636409 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 57365C04FFE for ; Fri, 19 Apr 2024 13:53:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-ID:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=TU20SWNImduPs60Kv6JKU/BCPWw87XMrfkuxCpFujqo=; b=kZPMP57VYGLOor H9VGb6Hx5edjE2U7N26HnPQEcDpJWfy8AFY8e7w+rLhilzW/J/7M1Oo/5V8CqFFHPMUVowopsvZ5H IAvuv4L6515N1VPcK4jbVbxDO7AsInrfWnkRXAjWFTIVGs4X352Lk8kYZIBqJItzzSRqAdALnGDb+ SAS5VN14s3HMuzLE/buujk9sligoi+x7m3MLcFFrRwSiHyHz7GEsTIAiJUHISSHq3LJd1cXoGKU4B qKgXflKEGXJY/tybhezBUhxdRUMYUIgYS+riT8TiQ3WMqD94gPyRIfAmU7lqCZ7vZmAW/KfmnZNkF tT89aIXuho89x2CUd7wg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rxogD-00000005pD3-3LYe; Fri, 19 Apr 2024 13:53:29 +0000 Received: from mail-lf1-x133.google.com ([2a00:1450:4864:20::133]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rxogA-00000005pB8-2mO2 for linux-riscv@lists.infradead.org; Fri, 19 Apr 2024 13:53:28 +0000 Received: by mail-lf1-x133.google.com with SMTP id 2adb3069b0e04-51967f75729so2401719e87.0 for ; Fri, 19 Apr 2024 06:53:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ventanamicro.com; s=google; t=1713534803; x=1714139603; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=Vygojg6kK2t93LE6Jccui0sWTwt0Dla9UnPOwn3MABA=; b=EqpVD4341UgPm8HoXDFa6bk+/nohjOIe8tGzMQRXH7zL47NHFv4w+ZrzlHWfRZST48 g01Cl7Gq24zv4/u4H+S5bENTQZJ4Pgl9SMwZ0Yyq0gxdFHuBTXrBS8JNbst3Ule/E7ls VA2cv8CvECwnAOLlEXB6JWNgGkja59+T88UCcfgcSwnmK1cUZUCm9T5LAQbUIsySWrPm pyE2WZD8kD8QH+Tnvc5sHnvroIt9CY8iS+Mg/fV8miOipt82yzVQICuPwtgqfunNggPh VvmuQrkGU7OFuduRUZBw4BfUa3j1vyBX4u380yGrJYUEUPkEGt0h7v+yxY2Y/ymFrhaD Dujg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713534803; x=1714139603; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Vygojg6kK2t93LE6Jccui0sWTwt0Dla9UnPOwn3MABA=; b=jCFdYjq8epa0vbm/7fuR1XAU9Jb4d1dTUhbxY33A89NHkAIP3Ki/6g8C5CuSp/lUnP Qv+k35KPoPn3/xSHaN/HILPCXIgqGnlxjvxXFhncwBPTbFa02cwBNTN2g40ZdewCRNug 60S0RXENICXQnVINgZm7rMtH8KYJx853z5r2ZgUY1rr/g8BHX/dUBBRGH9v41VH+k6DF kjqLOP2vrsASKjYpxtIIvjCy/xI3pbBWAeVFo9cplDdsrD5tmj1yluDh+BJVLcr8Xy+1 PV0sCtyLJ+rVY1FkPuO2NyMbhHL0MMvHONuH0P7Kf2wr9a0rQ5RECJwMbhFQT6ir6n65 JJ3w== X-Gm-Message-State: AOJu0Ywo8b9uZQi7blNnygBPDJoJ7cqfNctLho5+nLb+7E5Qp2Foin1B h11HH3OKl6hiT0U5AjyBFwDDzF32y9xIIq/1ZAE8i7jJ0CsgABZuaXYCnmD4FiI0tdiolpHBRrK FTDk= X-Google-Smtp-Source: AGHT+IFFzEV9Mdl8G4cryaHfYH+SN86dJZ7B9fY5aMYsjcaqBCQ0YnmeqoSttiNY9Cm5AgowfnUBMg== X-Received: by 2002:ac2:5388:0:b0:519:14a2:72da with SMTP id g8-20020ac25388000000b0051914a272damr1453236lfh.67.1713534803347; Fri, 19 Apr 2024 06:53:23 -0700 (PDT) Received: from localhost (2001-1ae9-1c2-4c00-20f-c6b4-1e57-7965.ip6.tmcz.cz. [2001:1ae9:1c2:4c00:20f:c6b4:1e57:7965]) by smtp.gmail.com with ESMTPSA id lj26-20020a170906f9da00b00a5254ec731esm2242648ejb.176.2024.04.19.06.53.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Apr 2024 06:53:22 -0700 (PDT) From: Andrew Jones To: linux-riscv@lists.infradead.org, kvm-riscv@lists.infradead.org, devicetree@vger.kernel.org Cc: paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, conor.dooley@microchip.com, anup@brainfault.org, atishp@atishpatra.org, robh@kernel.org, krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org, christoph.muellner@vrull.eu, heiko@sntech.de, charlie@rivosinc.com, David.Laight@ACULAB.COM, parri.andrea@gmail.com, luxu.kernel@bytedance.com Subject: [PATCH v2 0/6] riscv: Apply Zawrs when available Date: Fri, 19 Apr 2024 15:53:22 +0200 Message-ID: <20240419135321.70781-8-ajones@ventanamicro.com> X-Mailer: git-send-email 2.44.0 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240419_065326_899309_697A6313 X-CRM114-Status: GOOD ( 22.39 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org Zawrs provides two instructions (wrs.nto and wrs.sto), where both are meant to allow the hart to enter a low-power state while waiting on a store to a memory location. The instructions also both wait an implementation-defined "short" duration (unless the implementation terminates the stall for another reason). The difference is that while wrs.sto will terminate when the duration elapses, wrs.nto, depending on configuration, will either just keep waiting or an ILL exception will be raised. Linux will use wrs.nto, so if platforms have an implementation which falls in the "just keep waiting" category, then it should _not_ advertise Zawrs in the hardware description. Text to that effect has been added to the Zawrs DT definition. Like wfi (and with the same {m,h}status bits to configure it), when wrs.nto is configured to raise exceptions it's expected that the higher privilege level will see the instruction was a wait instruction, do something, and then resume execution following the instruction. For example, KVM does configure exceptions for wfi (hstatus.VTW=1) and therefore also for wrs.nto. KVM does this for wfi since it's better to allow other tasks to be scheduled while a VCPU waits for an interrupt. For waits such as those where wrs.nto/sto would be used, which are typically locks, it is also a good idea for KVM to be involved, as it can attempt to schedule the lock holding VCPU. This series starts with Christoph's addition of riscv smp_cond_load* functions which apply wrs.sto when available. That patch has been reworked to use wrs.nto and to use the same approach as Arm for the wait loop, since we can't have arbitrary C code between the load- reserved and the wrs. Then, hwprobe support is added (since the instructions are also usable from usermode), and finally KVM is taught about wrs.nto, allowing guests to see and use the Zawrs extension. We still don't have test results from hardware, and it's not possible to prove that using Zawrs is a win when testing on QEMU, not even when oversubscribing VCPUs to guests. However, it is possible to use KVM selftests to force a scenario where we can prove Zawrs does its job and does it well. [4] is a test which does this and, on my machine, without Zawrs it takes 16 seconds to complete and with Zawrs it takes 0.25 seconds. This series is also available here [1]. In order to use QEMU for testing a build with [2] is needed. In order to enable guests to use Zawrs with KVM using kvmtool, the branch at [3] may be used. [1] https://github.com/jones-drew/linux/commits/riscv/zawrs-v2/ [2] https://lore.kernel.org/all/20240312152901.512001-2-ajones@ventanamicro.com/ [3] https://github.com/jones-drew/kvmtool/commits/riscv/zawrs/ [4] https://github.com/jones-drew/linux/commit/9311702bcd118bdbfa8b9be4a8ec355c40559499 Thanks, drew v2: - Added DT bindings patch with additional Linux specifications due to wrs.nto potentially never terminating, as suggested by Palmer - Added patch to share pause insn definition - Rework main Zawrs support patch to use Arm approach (which is also the approach that Andrea Parri suggested) - Dropped the riscv implementation of smp_cond_load_acquire(). afaict, the generic implementation, which will use the riscv implementation of smp_cond_load_relaxed() is sufficient for riscv. - The rework was large enough (IMO) to drop Heiko's s-o-b and to add myself as a co-developer Andrew Jones (5): riscv: Provide a definition for 'pause' dt-bindings: riscv: Add Zawrs ISA extension description riscv: hwprobe: export Zawrs ISA extension KVM: riscv: Support guest wrs.nto KVM: riscv: selftests: Add Zawrs extension to get-reg-list test Christoph Müllner (1): riscv: Add Zawrs support for spinlocks Documentation/arch/riscv/hwprobe.rst | 4 ++ .../devicetree/bindings/riscv/extensions.yaml | 12 +++++ arch/riscv/Kconfig | 20 +++++--- arch/riscv/Makefile | 3 -- arch/riscv/include/asm/barrier.h | 45 ++++++++++------ arch/riscv/include/asm/cmpxchg.h | 51 +++++++++++++++++++ arch/riscv/include/asm/hwcap.h | 1 + arch/riscv/include/asm/insn-def.h | 4 ++ arch/riscv/include/asm/kvm_host.h | 1 + arch/riscv/include/asm/vdso/processor.h | 8 +-- arch/riscv/include/uapi/asm/hwprobe.h | 1 + arch/riscv/include/uapi/asm/kvm.h | 1 + arch/riscv/kernel/cpufeature.c | 1 + arch/riscv/kernel/sys_hwprobe.c | 1 + arch/riscv/kvm/vcpu.c | 1 + arch/riscv/kvm/vcpu_insn.c | 15 ++++++ arch/riscv/kvm/vcpu_onereg.c | 2 + .../selftests/kvm/riscv/get-reg-list.c | 4 ++ 18 files changed, 144 insertions(+), 31 deletions(-)