From patchwork Wed Feb 26 21:55:17 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13993249 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 52E3BC021B8 for ; Wed, 26 Feb 2025 22:03:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type:Cc:To:From: Subject:Message-ID:References:Mime-Version:In-Reply-To:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=YMoANj4p5EHkRVZCluw47mqWJPi0FfnC4TlDJfr4IcM=; b=IQ33hLsi9976OIFEjjcYipE2D7 fIvsbMgym07SoqJLzeIY4rvU7/J6satJ3eevUmKgy85Eo6Bo3l2Q8/kB9xWx27+2NVXg8JBnMgnYH ieeRWOXf3RGq0qawqEoGNXrLpawqSHXg/YiqHZ7tu66tWNr+smdbIMPlNWhBVsEStizkRwih4yPHE itfx5BePEYEGPOiVJhKQb8MQl9GTLzKIm1WisREd7MO/I+6sf9R6GXt8n0TnETKRP8x9jurrGD44+ OpHq/ejGerLeR5E03ej/6G9KPNkkLyK8mLgtoOEdOwerTzWGixOv8+aqUGhT8ZxYkW9rohi0Qo8uk nGUXl2gQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tnPVG-00000005Y1o-1BEg; Wed, 26 Feb 2025 22:03:42 +0000 Received: from mail-wr1-x449.google.com ([2a00:1450:4864:20::449]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tnPNH-00000005X89-1OBf for linux-arm-kernel@lists.infradead.org; Wed, 26 Feb 2025 21:55:28 +0000 Received: by mail-wr1-x449.google.com with SMTP id ffacd0b85a97d-38f27bddeeeso229747f8f.3 for ; Wed, 26 Feb 2025 13:55:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1740606925; x=1741211725; darn=lists.infradead.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=YMoANj4p5EHkRVZCluw47mqWJPi0FfnC4TlDJfr4IcM=; b=RLo670vf9eEwXd4SRsrwCEPcWj7AC0O5EuC02zFod/2dwB3RK7sLpQX7kb+vQvd+h0 LT94oNH8rhcWVsA2DNFH4MLSXAcydnGHJ2ttgmGbfoHKu3IkUm/teN4MQHuNelbogwg3 +ccmZz7lFBwOGir5lsa+NzfVb9Prpf1cWiz9OxKKwlmtcn0eaDemewlhLvUUofq7eKoz rsra+irIim0HdIe+4cUGoXTPMFoeEh1Hsmeijd2RrtPdVR/h445iryRllr8MrvjD21kb nqMbll0FB6zEmRk533v1wcWraIcN06z60ePEcSb2guoxdRKw2wwUMB38ULo+0rC4oNRn jxwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740606925; x=1741211725; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=YMoANj4p5EHkRVZCluw47mqWJPi0FfnC4TlDJfr4IcM=; b=MV+X7JNPrFVWvYwxuPySN8MzR7q/kiPu5SMPM4C3SLXoAKdYj9dwJEUmtVqHACYziC 4ykOx5OTIKcZLg/TDSS0dg7ijJNmrnuktZPflQIO4mqbVE7fc6tPLvEHW7N3pFP8nFOn /vO6uZc2AtY9e67Z6hIncV/j4DAr+mJ3Q86nW6XSHc0iCa3JuGw2FrFvOuq2pzooB35W 2eHcO8QlHOM/efFFyYrLIXod9ehXpDN6jF5+R6D91bgatquW3oIlfk8wtYFrGZeXKuX0 +wPqCuOdgdY/dzY6vg+nK9hxaulYTQ36OHoHCepHqISxnFAlBzkilbVCi51jo7rxQXtF 4KXA== X-Forwarded-Encrypted: i=1; AJvYcCWlP9PWlXkBf+Qv4xoUoO7qAOGxd34dCZ6I5kIfY1lm7Y5Unn41XjuTXkDgtAJEG+Q6BGk/OJOZbFx2gJEbXD70@lists.infradead.org X-Gm-Message-State: AOJu0YxB9U5O9l2apLJMlDrJtlCH/6dOkYP/hoA3ijY5B8CgejNnoE8E eekVFgP43GUoEhzllUG6eAQKmqh7D/dbyGxReSFqpt85FDDgOo+aEKX648usyDINGw35DFmO4A= = X-Google-Smtp-Source: AGHT+IEm+deGA2n4ENvCjeg0FnRMCCHXrVIT4UaweA5DEki0464Z4e8+WEQzh+GM4v+3iZ8npegFP/EaEw== X-Received: from wroa1.prod.google.com ([2002:adf:ed01:0:b0:38f:3703:662f]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6000:1845:b0:390:d82d:6d4f with SMTP id ffacd0b85a97d-390d82d71cemr4013404f8f.52.1740606925196; Wed, 26 Feb 2025 13:55:25 -0800 (PST) Date: Wed, 26 Feb 2025 21:55:17 +0000 In-Reply-To: <20250226215520.1759218-1-tabba@google.com> Mime-Version: 1.0 References: <20250226215520.1759218-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.711.g2feabab25a-goog Message-ID: <20250226215520.1759218-2-tabba@google.com> Subject: [PATCH v2 1/4] KVM: arm64: Factor out setting HCRX_EL2 traps into separate function From: Fuad Tabba To: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org Cc: maz@kernel.org, oliver.upton@linux.dev, mark.rutland@arm.com, will@kernel.org, joey.gouly@arm.com, suzuki.poulose@arm.com, yuzenghui@huawei.com, catalin.marinas@arm.com, broonie@kernel.org, qperret@google.com, vdonnefort@google.com, tabba@google.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250226_135527_369399_9A51B5B6 X-CRM114-Status: GOOD ( 14.78 ) X-BeenThere: linux-arm-kernel@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-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Factor out the code for setting a vcpu's HCRX_EL2 traps in to a separate inline function. This allows us to share the logic with pKVM when setting the traps in protected mode. No functional change intended. Signed-off-by: Fuad Tabba --- arch/arm64/include/asm/kvm_emulate.h | 24 ++++++++++++++++++++++++ arch/arm64/kvm/sys_regs.c | 20 +------------------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/arch/arm64/include/asm/kvm_emulate.h b/arch/arm64/include/asm/kvm_emulate.h index 78ec1ef2cfe8..31c8497372d0 100644 --- a/arch/arm64/include/asm/kvm_emulate.h +++ b/arch/arm64/include/asm/kvm_emulate.h @@ -649,4 +649,28 @@ static inline bool guest_hyp_sve_traps_enabled(const struct kvm_vcpu *vcpu) { return __guest_hyp_cptr_xen_trap_enabled(vcpu, ZEN); } + +static inline void vcpu_set_hcrx(struct kvm_vcpu *vcpu) +{ + struct kvm *kvm = vcpu->kvm; + + if (cpus_have_final_cap(ARM64_HAS_HCX)) { + /* + * In general, all HCRX_EL2 bits are gated by a feature. + * The only reason we can set SMPME without checking any + * feature is that its effects are not directly observable + * from the guest. + */ + vcpu->arch.hcrx_el2 = HCRX_EL2_SMPME; + + if (kvm_has_feat(kvm, ID_AA64ISAR2_EL1, MOPS, IMP)) + vcpu->arch.hcrx_el2 |= (HCRX_EL2_MSCEn | HCRX_EL2_MCE2); + + if (kvm_has_tcr2(kvm)) + vcpu->arch.hcrx_el2 |= HCRX_EL2_TCR2En; + + if (kvm_has_fpmr(kvm)) + vcpu->arch.hcrx_el2 |= HCRX_EL2_EnFPM; + } +} #endif /* __ARM64_KVM_EMULATE_H__ */ diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c index 82430c1e1dd0..16ce5f584e7c 100644 --- a/arch/arm64/kvm/sys_regs.c +++ b/arch/arm64/kvm/sys_regs.c @@ -4971,25 +4971,7 @@ void kvm_calculate_traps(struct kvm_vcpu *vcpu) mutex_lock(&kvm->arch.config_lock); vcpu_set_hcr(vcpu); vcpu_set_ich_hcr(vcpu); - - if (cpus_have_final_cap(ARM64_HAS_HCX)) { - /* - * In general, all HCRX_EL2 bits are gated by a feature. - * The only reason we can set SMPME without checking any - * feature is that its effects are not directly observable - * from the guest. - */ - vcpu->arch.hcrx_el2 = HCRX_EL2_SMPME; - - if (kvm_has_feat(kvm, ID_AA64ISAR2_EL1, MOPS, IMP)) - vcpu->arch.hcrx_el2 |= (HCRX_EL2_MSCEn | HCRX_EL2_MCE2); - - if (kvm_has_tcr2(kvm)) - vcpu->arch.hcrx_el2 |= HCRX_EL2_TCR2En; - - if (kvm_has_fpmr(kvm)) - vcpu->arch.hcrx_el2 |= HCRX_EL2_EnFPM; - } + vcpu_set_hcrx(vcpu); if (test_bit(KVM_ARCH_FLAG_FGU_INITIALIZED, &kvm->arch.flags)) goto out; From patchwork Wed Feb 26 21:55:18 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13993250 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 CD737C021B8 for ; Wed, 26 Feb 2025 22:05:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type:Cc:To:From: Subject:Message-ID:References:Mime-Version:In-Reply-To:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=uqZ6XQOG6VZQbAio3/rIqBlzFzoIEUifPodtQubNHl8=; b=bq61aqdBXUoCX4Mlz4swLXnNgZ Zr2B5vDMjP7kVqqoa41wdMJvh+12FqHOyBlzRAIzyEKJIETK/eWJRv50jl3BoBB/8nzMpvTScP70J +6v79e//wgpvOdlrPsgq4UiKB/iUUAgtLLsGca3rgViyjOt1RaJbS0xYFzs736DiK9rWmIXFp5QCy MCKtH50pD1odE54+2hmAhR3MMrC7ot/FPUBTwpTiVGdZMkhGF3zHqUR+9HtTvVGB72FXzlhxctIvy FhxSm6ck2FXcpbgBPH++OAg+sgBHTXoKEa+IJI7kiami2NB51ecDKXUIIfGXLszmq3GuOl9XBssnw HajZEaKQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tnPWl-00000005YNV-3sv6; Wed, 26 Feb 2025 22:05:15 +0000 Received: from mail-wm1-x34a.google.com ([2a00:1450:4864:20::34a]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tnPNI-00000005X8V-3hU1 for linux-arm-kernel@lists.infradead.org; Wed, 26 Feb 2025 21:55:29 +0000 Received: by mail-wm1-x34a.google.com with SMTP id 5b1f17b1804b1-43998ec3733so1316195e9.2 for ; Wed, 26 Feb 2025 13:55:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1740606927; x=1741211727; darn=lists.infradead.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=uqZ6XQOG6VZQbAio3/rIqBlzFzoIEUifPodtQubNHl8=; b=gQLLYd7E7EwEb32kekd3msOfm2KF6cG9sVgz2Kfy+e7pOaVCDaZv8HHTek0hQVMUVY lJSNbJ4SmxeixKYnxaHPHMpccF4893bdHLXN9JLCDSwCGwn5tIfQSFFa/0CHZdd5Rcqg M7a5QLsPi5D3321Y7gcxj2tCbOLCsOOLFGGE+XG+c3d+E0kOj6Ak7RcOhVYkw1AyDOx3 VitSJhXbqqezdnAAXnlQZ5+7/eP6bv9Hw5Vsfg6VhGSjdyeTcRc/VO7K2wfThNsEZt5s S7fdXX6Fa+vM1rYD29c/P1t2L3ptCdqo41q/TrDnA1nDgAbarATEaUtlfOIYEF/TPkxV S6sA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740606927; x=1741211727; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=uqZ6XQOG6VZQbAio3/rIqBlzFzoIEUifPodtQubNHl8=; b=sbTkA90jArXiSC0usztk6XoUoqNw+yBCRFHCWCgaX5goVuM7fSuI4rmf4KB7154WUk UEnNDoCOQGD4YhRtl/nuTtPESq9XFvW31Bd/3nj/4nL23yEGc0v79QDtkn8zdm8KOB2c imLbmnkYVUZ43Tux/TAx+8KhMcPrMrFuZv/fi1y6UCTFj6H0AQBOVG3vbihAOHo1Fg91 YO+qbkeb9njbqZFX8amKdRF036tum5ACUkvD+Mek2VSt71qSJIKWeQ8hjfqtyIleBmAa 4yw8txvawmy3iePjE4eJlfcJypdUTds5tYKZ/9ULcY8LhKGxGJCobtkYWYP6uAnUW4tz peSQ== X-Forwarded-Encrypted: i=1; AJvYcCU3e1aPfdZrLwTjCBs8uMp1WuJ7PmXUprZhtqf2LPiuaji24l6f3qg9jdam3ZJJcMcxPsdDllNb968PQUaB4NOR@lists.infradead.org X-Gm-Message-State: AOJu0YzB6zipVG1P8bR/SBknkrT31KPPVjBvJrrHdWsgN91KX3C6uSQa 7dtEYnk26A3qty+Gylkv7+raRJVcObC925AkJVW3/SdFEijfNYG5O0LnAjvNTKCVYXv3zCWpNA= = X-Google-Smtp-Source: AGHT+IGcdJx0F/SEgDdLOiwRrbPHFrSTncjn9smRK0tUigpTMlpaxS3SaYe8GOM83dky7LXzCw7XKzq2iA== X-Received: from wmbeq9.prod.google.com ([2002:a05:600c:8489:b0:439:8e81:fd03]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:46c7:b0:439:955d:c4e2 with SMTP id 5b1f17b1804b1-43ab0f3c192mr75104895e9.13.1740606927078; Wed, 26 Feb 2025 13:55:27 -0800 (PST) Date: Wed, 26 Feb 2025 21:55:18 +0000 In-Reply-To: <20250226215520.1759218-1-tabba@google.com> Mime-Version: 1.0 References: <20250226215520.1759218-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.711.g2feabab25a-goog Message-ID: <20250226215520.1759218-3-tabba@google.com> Subject: [PATCH v2 2/4] KVM: arm64: Initialize HCRX_EL2 traps in pKVM From: Fuad Tabba To: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org Cc: maz@kernel.org, oliver.upton@linux.dev, mark.rutland@arm.com, will@kernel.org, joey.gouly@arm.com, suzuki.poulose@arm.com, yuzenghui@huawei.com, catalin.marinas@arm.com, broonie@kernel.org, qperret@google.com, vdonnefort@google.com, tabba@google.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250226_135528_917720_8D9B81AD X-CRM114-Status: GOOD ( 13.42 ) X-BeenThere: linux-arm-kernel@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-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Initialize and set the traps controlled by the HCRX_EL2 in pKVM. Signed-off-by: Fuad Tabba --- arch/arm64/kvm/hyp/nvhe/pkvm.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/arch/arm64/kvm/hyp/nvhe/pkvm.c b/arch/arm64/kvm/hyp/nvhe/pkvm.c index 3927fe52a3dd..6efb9bf56180 100644 --- a/arch/arm64/kvm/hyp/nvhe/pkvm.c +++ b/arch/arm64/kvm/hyp/nvhe/pkvm.c @@ -166,8 +166,13 @@ static int pkvm_vcpu_init_traps(struct pkvm_hyp_vcpu *hyp_vcpu) pkvm_vcpu_reset_hcr(vcpu); - if ((!pkvm_hyp_vcpu_is_protected(hyp_vcpu))) + if ((!pkvm_hyp_vcpu_is_protected(hyp_vcpu))) { + struct kvm_vcpu *host_vcpu = hyp_vcpu->host_vcpu; + + /* Trust the host for non-protected vcpu features. */ + vcpu->arch.hcrx_el2 = host_vcpu->arch.hcrx_el2; return 0; + } ret = pkvm_check_pvm_cpu_features(vcpu); if (ret) @@ -175,6 +180,7 @@ static int pkvm_vcpu_init_traps(struct pkvm_hyp_vcpu *hyp_vcpu) pvm_init_traps_hcr(vcpu); pvm_init_traps_mdcr(vcpu); + vcpu_set_hcrx(vcpu); return 0; } From patchwork Wed Feb 26 21:55:19 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13993265 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 2B1F0C19776 for ; Wed, 26 Feb 2025 22:06:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type:Cc:To:From: Subject:Message-ID:References:Mime-Version:In-Reply-To:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=BlVLEjSuR40DJq8DeUp7Tn/A3CFsKq1qRgCr3BfZnrg=; b=TuFojlgVzqjHGvf+OmLAgC2T2m SdOWCkQY3eKRPYPt0kwAH482QY1TNt3ygUaIeyygad1l4tbu3Kv8ABHAweKoOPCfz+BznU9OrHkm0 mmjzJ+Vjh/rZIIFYGsx3fXfSlTKrWHHon4NkNe9LzmmGgcLn2l3iV97U7f4o+NYCSHZ3Ps+/IdCN2 VD6/d97iMTEBOyp1WGqVnTv4EiiY/gHLYbhbxXZH6p52x0cUkQiViplE8RcCdP3MBAjswUH/TiOwE tZQ0lnqNd6eJgG0mK8nhaV7X/a6J8iVVKA7aev7RfOwvPTVm+Jk4b1r1rp408USM9IvkWeXO1lQVt OCtN8XDw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tnPYH-00000005Yjk-2paw; Wed, 26 Feb 2025 22:06:49 +0000 Received: from mail-ed1-x549.google.com ([2a00:1450:4864:20::549]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tnPNL-00000005X8v-19dL for linux-arm-kernel@lists.infradead.org; Wed, 26 Feb 2025 21:55:32 +0000 Received: by mail-ed1-x549.google.com with SMTP id 4fb4d7f45d1cf-5da14484978so206234a12.0 for ; Wed, 26 Feb 2025 13:55:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1740606929; x=1741211729; darn=lists.infradead.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=BlVLEjSuR40DJq8DeUp7Tn/A3CFsKq1qRgCr3BfZnrg=; b=0RACNPLQ0b9E8BM0l21xYk6J+aEjOhHni389AbGb+R9XikqFFjs+iq1uUuot+Sezin 3vtV0QIAfyyHipqV9VVXCr8aP7cB+TWsJ5J3YLnvU99b2wu4K2xKY0cNgPPqX5JJqN3Z u5j8Ov8Zo3DgKaRCTQCtt0l0VAV4V1fNJsdIHEYPzF1ltOTyKu9mBIAne/DxWz0/2J5F Oco8SAsZ8HH4JCnq7FctKdwxw62cD7SYycay7lpxUkRjJ//GAmOLkk5Sfa+nJ1SmkWum zKvBmw27z3tja/2Sp9ZJ45HWGpnrZQ2Fls/60NuGeeolWQjftxoZS3iSBkuuh1bJgxMP j2dw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740606929; x=1741211729; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=BlVLEjSuR40DJq8DeUp7Tn/A3CFsKq1qRgCr3BfZnrg=; b=fKeCyk2GSrWSahUjACYj74Q7G5i2Fg0Prp11AGJy6Q5u7t22+YMtgGBfFa4DqeDd6X l9nPBsXI+1w/iTtdhgX8sXdkryR1J+JSvR/gfzo+XqjJISDIjFx1BLWue30Uqdv6oeHw pWK5jlTqrFKLb8qcr8RuIJaKhEQgtRvHUF92gTyg/iR2FU3c4cO6QpHT2A48LX0wDKEF tazX5gTSBvnbe1U9jlIt2VCJhsv1zanmO7dRigdU7dYelQospLygui5vKFOBnR5fSlRA bfJdTBw1KdlzflRh9ctRgfyifTCnraZpimMbYRU1CIz6F1c+hVQLtol7jDH2UHobKaNs lUEA== X-Forwarded-Encrypted: i=1; AJvYcCVeZu+GhfsQf2PiPAOPoh+uL107IJVF+Binh6vyiChLX/rTKw2nc/1papSj+3D/VIYEc/ZwAgB0NH9oPPqzYZ8v@lists.infradead.org X-Gm-Message-State: AOJu0YyYJVdevz7jkutdbuaAoPoqH5YcRF8CmmCwYTPYGxWWVQ3yYExo SegJfExRyHrV2DyqxYDtzXdTqvS1PPbJv7Q1jdKyZtq0TgEv5yl5c6pM4+h/LlPQa8siGjm1uA= = X-Google-Smtp-Source: AGHT+IEddKLeb5DU9aLaMmqh8NRm6HKFBbipNbn6fg8v8hDnY6472Y5nLiUu15PYKstb25+YBP5pSMprRQ== X-Received: from edwj18.prod.google.com ([2002:a05:6402:11d2:b0:5e4:befa:4839]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6402:3583:b0:5e0:9ffa:1348 with SMTP id 4fb4d7f45d1cf-5e0b70cb619mr23003688a12.2.1740606929001; Wed, 26 Feb 2025 13:55:29 -0800 (PST) Date: Wed, 26 Feb 2025 21:55:19 +0000 In-Reply-To: <20250226215520.1759218-1-tabba@google.com> Mime-Version: 1.0 References: <20250226215520.1759218-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.711.g2feabab25a-goog Message-ID: <20250226215520.1759218-4-tabba@google.com> Subject: [PATCH v2 3/4] KVM: arm64: Factor out pKVM hyp vcpu creation to separate function From: Fuad Tabba To: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org Cc: maz@kernel.org, oliver.upton@linux.dev, mark.rutland@arm.com, will@kernel.org, joey.gouly@arm.com, suzuki.poulose@arm.com, yuzenghui@huawei.com, catalin.marinas@arm.com, broonie@kernel.org, qperret@google.com, vdonnefort@google.com, tabba@google.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250226_135531_311091_119419AC X-CRM114-Status: GOOD ( 14.58 ) X-BeenThere: linux-arm-kernel@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-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Move the code that creates and initializes the hyp view of a vcpu in pKVM to its own function. This is meant to make the transition to initializing every vcpu individually clearer. Signed-off-by: Fuad Tabba --- arch/arm64/kvm/pkvm.c | 48 ++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/arch/arm64/kvm/pkvm.c b/arch/arm64/kvm/pkvm.c index 930b677eb9b0..06665cf221bf 100644 --- a/arch/arm64/kvm/pkvm.c +++ b/arch/arm64/kvm/pkvm.c @@ -113,6 +113,24 @@ static void __pkvm_destroy_hyp_vm(struct kvm *host_kvm) free_hyp_memcache(&host_kvm->arch.pkvm.teardown_mc); } +static int __pkvm_create_hyp_vcpu(struct kvm_vcpu *vcpu) +{ + size_t hyp_vcpu_sz = PAGE_ALIGN(PKVM_HYP_VCPU_SIZE); + pkvm_handle_t handle = vcpu->kvm->arch.pkvm.handle; + void *hyp_vcpu; + int ret; + + hyp_vcpu = alloc_pages_exact(hyp_vcpu_sz, GFP_KERNEL_ACCOUNT); + if (!hyp_vcpu) + return -ENOMEM; + + ret = kvm_call_hyp_nvhe(__pkvm_init_vcpu, handle, vcpu, hyp_vcpu); + if (ret) + free_pages_exact(hyp_vcpu, hyp_vcpu_sz); + + return ret; +} + /* * Allocates and donates memory for hypervisor VM structs at EL2. * @@ -125,9 +143,8 @@ static void __pkvm_destroy_hyp_vm(struct kvm *host_kvm) */ static int __pkvm_create_hyp_vm(struct kvm *host_kvm) { - size_t pgd_sz, hyp_vm_sz, hyp_vcpu_sz; + size_t pgd_sz, hyp_vm_sz; struct kvm_vcpu *host_vcpu; - pkvm_handle_t handle; void *pgd, *hyp_vm; unsigned long idx; int ret; @@ -161,33 +178,12 @@ static int __pkvm_create_hyp_vm(struct kvm *host_kvm) if (ret < 0) goto free_vm; - handle = ret; + WRITE_ONCE(host_kvm->arch.pkvm.handle, ret); - host_kvm->arch.pkvm.handle = handle; - - /* Donate memory for the vcpus at hyp and initialize it. */ - hyp_vcpu_sz = PAGE_ALIGN(PKVM_HYP_VCPU_SIZE); kvm_for_each_vcpu(idx, host_vcpu, host_kvm) { - void *hyp_vcpu; - - /* Indexing of the vcpus to be sequential starting at 0. */ - if (WARN_ON(host_vcpu->vcpu_idx != idx)) { - ret = -EINVAL; - goto destroy_vm; - } - - hyp_vcpu = alloc_pages_exact(hyp_vcpu_sz, GFP_KERNEL_ACCOUNT); - if (!hyp_vcpu) { - ret = -ENOMEM; - goto destroy_vm; - } - - ret = kvm_call_hyp_nvhe(__pkvm_init_vcpu, handle, host_vcpu, - hyp_vcpu); - if (ret) { - free_pages_exact(hyp_vcpu, hyp_vcpu_sz); + ret = __pkvm_create_hyp_vcpu(host_vcpu); + if (ret) goto destroy_vm; - } } return 0; From patchwork Wed Feb 26 21:55:20 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 13993266 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 5DBD5C021B8 for ; Wed, 26 Feb 2025 22:08:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Type:Cc:To:From: Subject:Message-ID:References:Mime-Version:In-Reply-To:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=tJ7+KQbuHqWRSfbyGJAvgvQY/mr7Mv4w5E1Ef9PUYYI=; b=wH0Zft7uXGv6+8HBYpcux+k/TS aGVBQfB8tSlFWFt2EOQ00tuljHnBwsS08nValKydqlF1vCNsZu36VZvOyEB9vZlIOKzPBSE7Xq8/Y x5OgzpZ2j6Vb3j9lbCmMdcp0S6+BRcw+/d4xE0yYQs5q0TRDThk40tupl0TlgE37vH+JJztsxq0ir q+xZc4HFOTKPC11RG1toxm8MwaO8JQUo+bsmzBdYHQF7YP5Tt8JSGvY+qeoqnyjaDThhWNKgPFffx 88j95MYYtwEGBprvmTWmO9YQs6IoMS6al6xeCN3Dn0b8PcPzUOh+EeNGjrSH/yEnrUvKuedyrXN39 8AYzXaNw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tnPZo-00000005Yzi-1PZt; Wed, 26 Feb 2025 22:08:24 +0000 Received: from mail-wr1-x44a.google.com ([2a00:1450:4864:20::44a]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tnPNN-00000005X9K-0eQu for linux-arm-kernel@lists.infradead.org; Wed, 26 Feb 2025 21:55:34 +0000 Received: by mail-wr1-x44a.google.com with SMTP id ffacd0b85a97d-38f628ff78eso148992f8f.1 for ; Wed, 26 Feb 2025 13:55:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1740606931; x=1741211731; darn=lists.infradead.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=tJ7+KQbuHqWRSfbyGJAvgvQY/mr7Mv4w5E1Ef9PUYYI=; b=LAJzFPaYuR2VyNEyDucTEZ+KvxqowVQAdLe8V6gtjNnt01023LcU5tRtsz1F5BoUv+ vKxXki53dsk4A1mP75VdolGCVgpasg+xX7GKy7m06Mq9gX2B/0bw0Zv9w/DzF/OAlvph 4f0A4yBJRXRoysYbxdAmADq7aAzpJnXVPPCmm8cPRa0wBKlEuTANFv0F0vkxSpGi7EUL S20obluhKMVajxoGwh9M5FxfDDbzKINBZKilIi8GXFIzyd+nP3kCIE6HmAPX5u8w0nNg 5rA/lPDRBzjCd4Ch21Ff0WN+nMkd8oHvHBMqW0W08p5vf8Bs3fUSzxdXLVs+8DVeCMHL IxPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740606931; x=1741211731; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=tJ7+KQbuHqWRSfbyGJAvgvQY/mr7Mv4w5E1Ef9PUYYI=; b=WIdnqUxbkeU+dlI8EqTdLSOy1umtbm+AupMh/TYH5OdJ1oGhLufEBH5p/TeVTLZ7B0 ehVVVVQM51n/lAPGwPUEZz9zq0GhjAusQyV8sn4ViQeIbknuTP2t99WVnwU+4D8WmHFi eizO/ZgfT5Yst+2ZkRH9qM7pDFAwTra/qW4dsjWgw2CViktkptp+o4QX/+m/TqvQ42SL z60FXyTFFVkPsLrAcmoguqK6uAxZKZpSwr6y7NAlLvBhcGoRWefe20KBwIHwHmBKUzNQ lWz9GfK7gZXzLi4up4Q8Vl3Rz7hBbaSjYmj1DU4ZQVEjRXdSoSaGvQNmBZRyaEqn+I3T MY+g== X-Forwarded-Encrypted: i=1; AJvYcCXGK5CQ/hDqixpREonDcE4Mj7+4V/seo0AEm2+JweuXzEM4GWwUdizK9+gVB/AK+Aa/xriXlhR8aFVu52/qr4FV@lists.infradead.org X-Gm-Message-State: AOJu0YwK+5UyUOJTIhJRMGZIxAygMP2jqwsC6rYEMrOr8r80FtMUqitU ESlMwodJxqf+GxV1DpMKbtzmuNDZxqpl3NZnBeZd/n04R2pB0/HS6tkeu4oyBlgcDF/WQ61uRA= = X-Google-Smtp-Source: AGHT+IHDhAsp1nno//nPl2At9qgA+VgSPYHGXDoZbiK+SFBzzHnFyl/e7ZT+ADtfrG0th/kkfg/+o6ZYfA== X-Received: from wrzd5.prod.google.com ([2002:a5d:6dc5:0:b0:38f:3ee0:73f5]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6000:2ac:b0:38d:ae4e:2267 with SMTP id ffacd0b85a97d-390e166dcd7mr846883f8f.11.1740606931386; Wed, 26 Feb 2025 13:55:31 -0800 (PST) Date: Wed, 26 Feb 2025 21:55:20 +0000 In-Reply-To: <20250226215520.1759218-1-tabba@google.com> Mime-Version: 1.0 References: <20250226215520.1759218-1-tabba@google.com> X-Mailer: git-send-email 2.48.1.711.g2feabab25a-goog Message-ID: <20250226215520.1759218-5-tabba@google.com> Subject: [PATCH v2 4/4] KVM: arm64: Create each pKVM hyp vcpu after its corresponding host vcpu From: Fuad Tabba To: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org Cc: maz@kernel.org, oliver.upton@linux.dev, mark.rutland@arm.com, will@kernel.org, joey.gouly@arm.com, suzuki.poulose@arm.com, yuzenghui@huawei.com, catalin.marinas@arm.com, broonie@kernel.org, qperret@google.com, vdonnefort@google.com, tabba@google.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250226_135533_196775_E157187D X-CRM114-Status: GOOD ( 23.62 ) X-BeenThere: linux-arm-kernel@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-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Instead of creating and initializing _all_ hyp vcpus in pKVM when the first host vcpu runs for the first time, initialize _each_ hyp vcpu in conjunction with its corresponding host vcpu. Some of the host vcpu state (e.g., system registers and traps values) is not initialized until the first time the host vcpu is run. Therefore, initializing a hyp vcpu before its corresponding host vcpu has run for the first time might not view the complete host state of these vcpus. Additionally, this behavior is inline with non-protected modes. Signed-off-by: Fuad Tabba --- arch/arm64/include/asm/kvm_host.h | 2 + arch/arm64/include/asm/kvm_pkvm.h | 1 + arch/arm64/kvm/arm.c | 4 ++ arch/arm64/kvm/hyp/include/nvhe/pkvm.h | 6 --- arch/arm64/kvm/hyp/nvhe/pkvm.c | 54 +++++++++++++++----------- arch/arm64/kvm/pkvm.c | 28 ++++++------- 6 files changed, 53 insertions(+), 42 deletions(-) diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index 3a7ec98ef123..4a0e522f6001 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -869,6 +869,8 @@ struct kvm_vcpu_arch { #define VCPU_INITIALIZED __vcpu_single_flag(cflags, BIT(0)) /* SVE config completed */ #define VCPU_SVE_FINALIZED __vcpu_single_flag(cflags, BIT(1)) +/* pKVM VCPU setup completed */ +#define VCPU_PKVM_FINALIZED __vcpu_single_flag(cflags, BIT(2)) /* Exception pending */ #define PENDING_EXCEPTION __vcpu_single_flag(iflags, BIT(0)) diff --git a/arch/arm64/include/asm/kvm_pkvm.h b/arch/arm64/include/asm/kvm_pkvm.h index eb65f12e81d9..abd693ce5b93 100644 --- a/arch/arm64/include/asm/kvm_pkvm.h +++ b/arch/arm64/include/asm/kvm_pkvm.h @@ -19,6 +19,7 @@ int pkvm_init_host_vm(struct kvm *kvm); int pkvm_create_hyp_vm(struct kvm *kvm); void pkvm_destroy_hyp_vm(struct kvm *kvm); +int pkvm_create_hyp_vcpu(struct kvm_vcpu *vcpu); /* * This functions as an allow-list of protected VM capabilities. diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index b8e55a441282..cd7a808eeb64 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -833,6 +833,10 @@ int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu) ret = pkvm_create_hyp_vm(kvm); if (ret) return ret; + + ret = pkvm_create_hyp_vcpu(vcpu); + if (ret) + return ret; } mutex_lock(&kvm->arch.config_lock); diff --git a/arch/arm64/kvm/hyp/include/nvhe/pkvm.h b/arch/arm64/kvm/hyp/include/nvhe/pkvm.h index e42bf68c8848..ce31d3b73603 100644 --- a/arch/arm64/kvm/hyp/include/nvhe/pkvm.h +++ b/arch/arm64/kvm/hyp/include/nvhe/pkvm.h @@ -43,12 +43,6 @@ struct pkvm_hyp_vm { struct hyp_pool pool; hyp_spinlock_t lock; - /* - * The number of vcpus initialized and ready to run. - * Modifying this is protected by 'vm_table_lock'. - */ - unsigned int nr_vcpus; - /* Array of the hyp vCPU structures for this VM. */ struct pkvm_hyp_vcpu *vcpus[]; }; diff --git a/arch/arm64/kvm/hyp/nvhe/pkvm.c b/arch/arm64/kvm/hyp/nvhe/pkvm.c index 6efb9bf56180..4ef3748dc660 100644 --- a/arch/arm64/kvm/hyp/nvhe/pkvm.c +++ b/arch/arm64/kvm/hyp/nvhe/pkvm.c @@ -245,10 +245,12 @@ struct pkvm_hyp_vcpu *pkvm_load_hyp_vcpu(pkvm_handle_t handle, hyp_spin_lock(&vm_table_lock); hyp_vm = get_vm_by_handle(handle); - if (!hyp_vm || hyp_vm->nr_vcpus <= vcpu_idx) + if (!hyp_vm || hyp_vm->kvm.created_vcpus <= vcpu_idx) goto unlock; hyp_vcpu = hyp_vm->vcpus[vcpu_idx]; + if (!hyp_vcpu) + goto unlock; /* Ensure vcpu isn't loaded on more than one cpu simultaneously. */ if (unlikely(hyp_vcpu->loaded_hyp_vcpu)) { @@ -367,8 +369,14 @@ static void unpin_host_vcpus(struct pkvm_hyp_vcpu *hyp_vcpus[], { int i; - for (i = 0; i < nr_vcpus; i++) - unpin_host_vcpu(hyp_vcpus[i]->host_vcpu); + for (i = 0; i < nr_vcpus; i++) { + struct pkvm_hyp_vcpu *hyp_vcpu = hyp_vcpus[i]; + + if (!hyp_vcpu) + continue; + + unpin_host_vcpu(hyp_vcpu->host_vcpu); + } } static void init_pkvm_hyp_vm(struct kvm *host_kvm, struct pkvm_hyp_vm *hyp_vm, @@ -392,24 +400,18 @@ static void pkvm_vcpu_init_sve(struct pkvm_hyp_vcpu *hyp_vcpu, struct kvm_vcpu * static int init_pkvm_hyp_vcpu(struct pkvm_hyp_vcpu *hyp_vcpu, struct pkvm_hyp_vm *hyp_vm, - struct kvm_vcpu *host_vcpu, - unsigned int vcpu_idx) + struct kvm_vcpu *host_vcpu) { int ret = 0; if (hyp_pin_shared_mem(host_vcpu, host_vcpu + 1)) return -EBUSY; - if (host_vcpu->vcpu_idx != vcpu_idx) { - ret = -EINVAL; - goto done; - } - hyp_vcpu->host_vcpu = host_vcpu; hyp_vcpu->vcpu.kvm = &hyp_vm->kvm; hyp_vcpu->vcpu.vcpu_id = READ_ONCE(host_vcpu->vcpu_id); - hyp_vcpu->vcpu.vcpu_idx = vcpu_idx; + hyp_vcpu->vcpu.vcpu_idx = READ_ONCE(host_vcpu->vcpu_idx); hyp_vcpu->vcpu.arch.hw_mmu = &hyp_vm->kvm.arch.mmu; hyp_vcpu->vcpu.arch.cflags = READ_ONCE(host_vcpu->arch.cflags); @@ -647,27 +649,28 @@ int __pkvm_init_vcpu(pkvm_handle_t handle, struct kvm_vcpu *host_vcpu, goto unlock; } - idx = hyp_vm->nr_vcpus; + ret = init_pkvm_hyp_vcpu(hyp_vcpu, hyp_vm, host_vcpu); + if (ret) + goto unlock; + + idx = hyp_vcpu->vcpu.vcpu_idx; if (idx >= hyp_vm->kvm.created_vcpus) { ret = -EINVAL; goto unlock; } - ret = init_pkvm_hyp_vcpu(hyp_vcpu, hyp_vm, host_vcpu, idx); - if (ret) + if (hyp_vm->vcpus[idx]) { + ret = -EINVAL; goto unlock; + } hyp_vm->vcpus[idx] = hyp_vcpu; - hyp_vm->nr_vcpus++; unlock: hyp_spin_unlock(&vm_table_lock); - if (ret) { + if (ret) unmap_donated_memory(hyp_vcpu, sizeof(*hyp_vcpu)); - return ret; - } - - return 0; + return ret; } static void @@ -713,12 +716,17 @@ int __pkvm_teardown_vm(pkvm_handle_t handle) /* Reclaim guest pages (including page-table pages) */ mc = &host_kvm->arch.pkvm.teardown_mc; reclaim_guest_pages(hyp_vm, mc); - unpin_host_vcpus(hyp_vm->vcpus, hyp_vm->nr_vcpus); + unpin_host_vcpus(hyp_vm->vcpus, hyp_vm->kvm.created_vcpus); /* Push the metadata pages to the teardown memcache */ - for (idx = 0; idx < hyp_vm->nr_vcpus; ++idx) { + for (idx = 0; idx < hyp_vm->kvm.created_vcpus; ++idx) { struct pkvm_hyp_vcpu *hyp_vcpu = hyp_vm->vcpus[idx]; - struct kvm_hyp_memcache *vcpu_mc = &hyp_vcpu->vcpu.arch.pkvm_memcache; + struct kvm_hyp_memcache *vcpu_mc; + + if (!hyp_vcpu) + continue; + + vcpu_mc = &hyp_vcpu->vcpu.arch.pkvm_memcache; while (vcpu_mc->nr_pages) { void *addr = pop_hyp_memcache(vcpu_mc, hyp_phys_to_virt); diff --git a/arch/arm64/kvm/pkvm.c b/arch/arm64/kvm/pkvm.c index 06665cf221bf..f2a09dc50676 100644 --- a/arch/arm64/kvm/pkvm.c +++ b/arch/arm64/kvm/pkvm.c @@ -125,7 +125,9 @@ static int __pkvm_create_hyp_vcpu(struct kvm_vcpu *vcpu) return -ENOMEM; ret = kvm_call_hyp_nvhe(__pkvm_init_vcpu, handle, vcpu, hyp_vcpu); - if (ret) + if (!ret) + vcpu_set_flag(vcpu, VCPU_PKVM_FINALIZED); + else free_pages_exact(hyp_vcpu, hyp_vcpu_sz); return ret; @@ -144,9 +146,7 @@ static int __pkvm_create_hyp_vcpu(struct kvm_vcpu *vcpu) static int __pkvm_create_hyp_vm(struct kvm *host_kvm) { size_t pgd_sz, hyp_vm_sz; - struct kvm_vcpu *host_vcpu; void *pgd, *hyp_vm; - unsigned long idx; int ret; if (host_kvm->created_vcpus < 1) @@ -180,17 +180,7 @@ static int __pkvm_create_hyp_vm(struct kvm *host_kvm) WRITE_ONCE(host_kvm->arch.pkvm.handle, ret); - kvm_for_each_vcpu(idx, host_vcpu, host_kvm) { - ret = __pkvm_create_hyp_vcpu(host_vcpu); - if (ret) - goto destroy_vm; - } - return 0; - -destroy_vm: - __pkvm_destroy_hyp_vm(host_kvm); - return ret; free_vm: free_pages_exact(hyp_vm, hyp_vm_sz); free_pgd: @@ -210,6 +200,18 @@ int pkvm_create_hyp_vm(struct kvm *host_kvm) return ret; } +int pkvm_create_hyp_vcpu(struct kvm_vcpu *vcpu) +{ + int ret = 0; + + mutex_lock(&vcpu->kvm->arch.config_lock); + if (!vcpu_get_flag(vcpu, VCPU_PKVM_FINALIZED)) + ret = __pkvm_create_hyp_vcpu(vcpu); + mutex_unlock(&vcpu->kvm->arch.config_lock); + + return ret; +} + void pkvm_destroy_hyp_vm(struct kvm *host_kvm) { mutex_lock(&host_kvm->arch.config_lock);