From patchwork Tue Apr 13 13:42:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1465796 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org (client-ip=2404:9400:2:0:216:3eff:fee1:b9f1; helo=lists.ozlabs.org; envelope-from=linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=a9hdC8gx; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2404:9400:2:0:216:3eff:fee1:b9f1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4FKRdK6gS6z9sWK for ; Tue, 13 Apr 2021 23:43:17 +1000 (AEST) Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4FKRdK5fx6z30J0 for ; Tue, 13 Apr 2021 23:43:17 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=a9hdC8gx; dkim-atps=neutral X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::432; helo=mail-pf1-x432.google.com; envelope-from=npiggin@gmail.com; receiver=) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=a9hdC8gx; dkim-atps=neutral Received: from mail-pf1-x432.google.com (mail-pf1-x432.google.com [IPv6:2607:f8b0:4864:20::432]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4FKRcY6pj6z30Dq for ; Tue, 13 Apr 2021 23:42:37 +1000 (AEST) Received: by mail-pf1-x432.google.com with SMTP id w8so7978747pfn.9 for ; Tue, 13 Apr 2021 06:42:37 -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=aIFXl4n2S7P3tkdBMKDpSD5hoW2eh9a/kOWHPmLANoc=; b=a9hdC8gxYXkIUMjE7kaLVixRR+c2bEeHakuuhbRFTO2Rhbi2O2RB4J2ObLCP5vvVv6 NM5vghhwr/RqnXYXAtgNy/NTcYW7Bl2pz+Ztu+CPDlLgzbF4AQ/wPo5Ycbd3oJ4hpjvc Fc9GqjmXy2wBZb8QkgregjWl8Oj6BBZjCHRyddiYQjxq7WS8DV7vJR0Ea2dvRo/z6mBU RM4Xrwk1Ndm6u0f1bxqZKCEgXMEV4mqZ27bAt3SN9w6WJ0smF47AnW4TgGhreK2vq3mx meSCdejdPYDo3X9ad1LFE1SaPmlD5ktk40zFXep46MlkV7y2+bW3ryeQwKuzi4+xYEKL Y3Jw== 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=aIFXl4n2S7P3tkdBMKDpSD5hoW2eh9a/kOWHPmLANoc=; b=ohfH4J2ngxEYMTNQeowiUohV4XaYUYM4rd71rjJ8Sk2k7KGG9NYyA5A6jJ/XNUYu2g ARLs1mm3GG/qxJ3jCqE0Zpy3npZ09Sq5J4Q0QRs3DINKNrdGRkA55M+KeYmCoKzmwp6y rkpWaNXYvpMSMgcJYOU5/QVOe+QRIPECp14Cek8tgVoesay+oOb8DAkd5QQNWQD0U3Ek Nkjv+Q4k//Jl3oTfUIzVgJmVdo/ZjZsrw+YcGz7w2005yrMHjrxTdgtMHs+Psra6zEGI RvekcwT1nRidlCNYSAX72VsPfatK2nTHuOTiW4wmhZW+IiMp+UbaS2kVorMrgKukmAhl /ylw== X-Gm-Message-State: AOAM5320Uo52xgzInf4HYH7mYklvQX2vuulTFF9kJav/Ml22++Oma3J1 DKGm9kZcw2GAFeadGeusVUM= X-Google-Smtp-Source: ABdhPJyX1Q/bskGNFB2AqhCSy8C2F6XutdV4ZJZ16AVWY0/DeH3YKBgzlb6lwlP6pNHfxWTALbgmcg== X-Received: by 2002:a63:d810:: with SMTP id b16mr31024741pgh.72.1618321355531; Tue, 13 Apr 2021 06:42:35 -0700 (PDT) Received: from bobo.ibm.com (193-116-90-211.tpgi.com.au. [193.116.90.211]) by smtp.gmail.com with ESMTPSA id l22sm100465pjc.13.2021.04.13.06.42.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Apr 2021 06:42:35 -0700 (PDT) From: Nicholas Piggin To: kvm-ppc@vger.kernel.org Subject: [PATCH v1 1/2] KVM: PPC: Book3S HV P9: Move setting HDEC after switching to guest LPCR Date: Tue, 13 Apr 2021 23:42:22 +1000 Message-Id: <20210413134223.1691892-2-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20210413134223.1691892-1-npiggin@gmail.com> References: <20210413134223.1691892-1-npiggin@gmail.com> MIME-Version: 1.0 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Alexey Kardashevskiy , linuxppc-dev@lists.ozlabs.org, Nicholas Piggin , Fabiano Rosas Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" LPCR[HDICE]=0 suppresses hypervisor decrementer exceptions on some processors, so it must be enabled before HDEC is set. Rather than set it in the host LPCR then setting HDEC, move the HDEC update to after the guest MMU context (including LPCR) is loaded. There shouldn't be much concern with delaying HDEC by some 10s or 100s of nanoseconds by setting it a bit later. Reviewed-by: Alexey Kardashevskiy Reviewed-by: Fabiano Rosas Signed-off-by: Nicholas Piggin --- arch/powerpc/kvm/book3s_hv.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index 981bcaf787a8..48df339affdf 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c @@ -3502,20 +3502,9 @@ static int kvmhv_load_hv_regs_and_go(struct kvm_vcpu *vcpu, u64 time_limit, host_dawrx1 = mfspr(SPRN_DAWRX1); } - /* - * P8 and P9 suppress the HDEC exception when LPCR[HDICE] = 0, - * so set HDICE before writing HDEC. - */ - mtspr(SPRN_LPCR, vcpu->kvm->arch.host_lpcr | LPCR_HDICE); - isync(); - hdec = time_limit - mftb(); - if (hdec < 0) { - mtspr(SPRN_LPCR, vcpu->kvm->arch.host_lpcr); - isync(); + if (hdec < 0) return BOOK3S_INTERRUPT_HV_DECREMENTER; - } - mtspr(SPRN_HDEC, hdec); if (vc->tb_offset) { u64 new_tb = mftb() + vc->tb_offset; @@ -3563,6 +3552,12 @@ static int kvmhv_load_hv_regs_and_go(struct kvm_vcpu *vcpu, u64 time_limit, mtspr(SPRN_LPCR, lpcr); isync(); + /* + * P9 suppresses the HDEC exception when LPCR[HDICE] = 0, + * so set guest LPCR (with HDICE) before writing HDEC. + */ + mtspr(SPRN_HDEC, hdec); + kvmppc_xive_push_vcpu(vcpu); mtspr(SPRN_SRR0, vcpu->arch.shregs.srr0); From patchwork Tue Apr 13 13:42:23 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1465797 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org (client-ip=2404:9400:2:0:216:3eff:fee1:b9f1; helo=lists.ozlabs.org; envelope-from=linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=Zc1rpsme; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2404:9400:2:0:216:3eff:fee1:b9f1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4FKRdn09dGz9sVv for ; Tue, 13 Apr 2021 23:43:41 +1000 (AEST) Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4FKRdm6d91z3cBQ for ; Tue, 13 Apr 2021 23:43:40 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=Zc1rpsme; dkim-atps=neutral X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::636; helo=mail-pl1-x636.google.com; envelope-from=npiggin@gmail.com; receiver=) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=Zc1rpsme; dkim-atps=neutral Received: from mail-pl1-x636.google.com (mail-pl1-x636.google.com [IPv6:2607:f8b0:4864:20::636]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4FKRcd6W6zz30C1 for ; Tue, 13 Apr 2021 23:42:41 +1000 (AEST) Received: by mail-pl1-x636.google.com with SMTP id z22so3107972plo.3 for ; Tue, 13 Apr 2021 06:42:41 -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=5DdIb7caJKIVHR38EDEC3oy5CdMMDVm1Jnwd54EA0OE=; b=Zc1rpsmepHixbpGPdvl3C7xqe+seW/GCoFmahZd+nUAD59TN5iVH6daSR+jGW9DB4D UzKHAbXllfuBrxpYlSqN+/x2PjuKFcONRJ3DJvGU6EXLakzbIXugWWB9VokQO52Tzik/ ATBI9bwV4etsz4+/kpZuBEjMPS5jcLm/m7bCq0XEI2SiPHPIh1Bl3sUirMsbpZTw/BJz MqAnrdqYQK/3FG3g8DYA7EJ4Z0lq8ln8q2PaQPDp/4FDcYEApXA+99+i0Wo5p06xb3sW qYjczrrNJpfMt0e1q6PiFl6kjhIIRs/1ydksnsyyVbTJnt0xCEuJbXG/bvE/YlwS4TK5 92CA== 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=5DdIb7caJKIVHR38EDEC3oy5CdMMDVm1Jnwd54EA0OE=; b=t9lm1LC24+DCPahIQO9Z4rYQGV6ebMIIj0nx64D7VSeHBkxjgVPjIPmbeuoX3uMmPE UWN5obWzlctMmw/XXOfNpJ1SnHAfwT/nsJYrI5h/ENQV6LEZMGuUNiFp4ObcDjDmi5Yk rIcdt8yLLHvemzPa7GHiIkE9YeQf2lhVYDz70fEE4ouwDaucNOw/wzjgrufdy7qnfg0n 4hIpkGQbI9/Hw64Zs2bi86grLMQ+SV8hUtq2nvuXJJxMtr+xTva+KqYVUCiPnTyJBIye jgfnGz//9Fp2WEfhsAN1vIPn7q29b78sN+KIyXE68p7xtML2wnMIBQjJROhWI+kYgIWz kjEA== X-Gm-Message-State: AOAM530Enm3OWkEyFSnUwnQRkB2Mn0HuH69+ERQHh3Mh4OX0Rur3aEmv 1B8R10ZbDRqT9KTN+u3NB5Y= X-Google-Smtp-Source: ABdhPJwJM71Lnf5SNTjBV9O13f5FVFZ2EFgpom4FI3mZ3owzvtOIxgSYvi52ogjmu4pNa1yDdIoRSw== X-Received: by 2002:a17:90b:4c47:: with SMTP id np7mr122192pjb.26.1618321359681; Tue, 13 Apr 2021 06:42:39 -0700 (PDT) Received: from bobo.ibm.com (193-116-90-211.tpgi.com.au. [193.116.90.211]) by smtp.gmail.com with ESMTPSA id l22sm100465pjc.13.2021.04.13.06.42.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 13 Apr 2021 06:42:39 -0700 (PDT) From: Nicholas Piggin To: kvm-ppc@vger.kernel.org Subject: [PATCH v1 2/2] KVM: PPC: Book3S HV P9: Reduce irq_work vs guest decrementer races Date: Tue, 13 Apr 2021 23:42:23 +1000 Message-Id: <20210413134223.1691892-3-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20210413134223.1691892-1-npiggin@gmail.com> References: <20210413134223.1691892-1-npiggin@gmail.com> MIME-Version: 1.0 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linuxppc-dev@lists.ozlabs.org, Nicholas Piggin Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" irq_work's use of the DEC SPR is racy with guest<->host switch and guest entry which flips the DEC interrupt to guest, which could lose a host work interrupt. This patch closes one race, and attempts to comment another class of races. Signed-off-by: Nicholas Piggin --- arch/powerpc/include/asm/time.h | 12 ++++++++++++ arch/powerpc/kernel/time.c | 10 ---------- arch/powerpc/kvm/book3s_hv.c | 15 +++++++++++++++ 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/arch/powerpc/include/asm/time.h b/arch/powerpc/include/asm/time.h index 8dd3cdb25338..8c2c3dd4ddba 100644 --- a/arch/powerpc/include/asm/time.h +++ b/arch/powerpc/include/asm/time.h @@ -97,6 +97,18 @@ extern void div128_by_32(u64 dividend_high, u64 dividend_low, extern void secondary_cpu_time_init(void); extern void __init time_init(void); +#ifdef CONFIG_PPC64 +static inline unsigned long test_irq_work_pending(void) +{ + unsigned long x; + + asm volatile("lbz %0,%1(13)" + : "=r" (x) + : "i" (offsetof(struct paca_struct, irq_work_pending))); + return x; +} +#endif + DECLARE_PER_CPU(u64, decrementers_next_tb); /* Convert timebase ticks to nanoseconds */ diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index b67d93a609a2..da995c5fb97d 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c @@ -508,16 +508,6 @@ EXPORT_SYMBOL(profile_pc); * 64-bit uses a byte in the PACA, 32-bit uses a per-cpu variable... */ #ifdef CONFIG_PPC64 -static inline unsigned long test_irq_work_pending(void) -{ - unsigned long x; - - asm volatile("lbz %0,%1(13)" - : "=r" (x) - : "i" (offsetof(struct paca_struct, irq_work_pending))); - return x; -} - static inline void set_irq_work_pending_flag(void) { asm volatile("stb %0,%1(13)" : : diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index 48df339affdf..bdc24e9cb096 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c @@ -3708,6 +3708,18 @@ static int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit, if (!(vcpu->arch.ctrl & 1)) mtspr(SPRN_CTRLT, mfspr(SPRN_CTRLF) & ~1); + /* + * When setting DEC, we must always deal with irq_work_raise via NMI vs + * setting DEC. The problem occurs right as we switch into guest mode + * if a NMI hits and sets pending work and sets DEC, then that will + * apply to the guest and not bring us back to the host. + * + * irq_work_raise could check a flag (or possibly LPCR[HDICE] for + * example) and set HDEC to 1? That wouldn't solve the nested hv + * case which needs to abort the hcall or zero the time limit. + * + * XXX: Another day's problem. + */ mtspr(SPRN_DEC, vcpu->arch.dec_expires - mftb()); if (kvmhv_on_pseries()) { @@ -3822,6 +3834,9 @@ static int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit, vc->in_guest = 0; mtspr(SPRN_DEC, local_paca->kvm_hstate.dec_expires - mftb()); + /* We may have raced with new irq work */ + if (test_irq_work_pending()) + set_dec(1); mtspr(SPRN_SPRG_VDSO_WRITE, local_paca->sprg_vdso); kvmhv_load_host_pmu();