From patchwork Fri Mar 14 11:18:29 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 14016669 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 7155FC282EC for ; Fri, 14 Mar 2025 11:23:30 +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=3IYRjktN0Xe+l0KkZ0Ly6k4G+9WnYnpIs+H0Ux3E9Tw=; b=UxlcQi8pNf7zpOklcUefnSY6cG SnAd90iN305p3IJyDESXP7p8YRvckTINUKUC92YiIZftaQGvy0gsJb4TJta5+59XpmWOawXVk/Yt1 n39ww4JWsL0lbA2MET8CwXcu5+d2xidC5aj/oRwovQWnfOObque2RPgn52uCF7k7ENSugcnh+J/3h mTMMHgdMwl3lOWoh4ruNbDOGmGP/rCSGilWUu00OSYqI8HIgm7vSLTxmnGqXjooklzgrMObejjStL Ltglnr4+CpbGe1bKYAW8VknNPjn24fCm8yb7YQblIxPisOTQMHYYUxSU1GdYNZ58P2ajMulzJi+MP 13B4UApQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tt38L-0000000DzTP-10Dj; Fri, 14 Mar 2025 11:23:21 +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 1tt33m-0000000Dybh-0WzW for linux-arm-kernel@lists.infradead.org; Fri, 14 Mar 2025 11:18:39 +0000 Received: by mail-wm1-x34a.google.com with SMTP id 5b1f17b1804b1-43d08915f61so12011335e9.2 for ; Fri, 14 Mar 2025 04:18:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1741951116; x=1742555916; 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=3IYRjktN0Xe+l0KkZ0Ly6k4G+9WnYnpIs+H0Ux3E9Tw=; b=1imTjkqKk68PAYbuXCnaW40M4JqYvAK6n0aWJYcjR958QmimhTk436sCX7q3grLiLV U6JUBGC0Crn41Etr7cdc0Fqrw0wj5xkCHk8SIlYkmeYSMFA8DmF6F98jy3t87uPFLQrN y3UsUguEwdI/wo+XPQCmWPV4hgc3s5RS5EHdt3q6NYGtTCMmKLqtx75vBUUHEyTRkKdq XzgPi5hBUxE4hmiTmK6+Lh7s0ooX4MhfTCHG3xk3yBK3RP+q7hP9y4FpeCGs20tPYmeF d3iiFBkOjht7c1t3DQc/5ivjSc4JU6dcAOSs2qX4lo8wBEmHxcBlIsILSdZgKIEw5zrE aEUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741951116; x=1742555916; 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=3IYRjktN0Xe+l0KkZ0Ly6k4G+9WnYnpIs+H0Ux3E9Tw=; b=VP3JVtlyp26TeSvJbwPcWevXRm8t6/cD65p7u9b7LMPTJ8kjd7vC3fUtWcGjsdIBW6 Q5IcIYzezm0OJON5zQAtSKd6sqOE3WmFydX3B523ZNxl9nGxcd3tjpJKd0waGk0qWWdh pJV6yLweIbAeb+zEi8W8kPktj2pHEoMvtqK5YC5j/h3zuqFqd810ObMVds5QACZ2TdVY 1GGX5fgbAR9pVtJROrYQY7Z5aC5QaYoPRrxiVXo8pW9b5GwjPFTva2onM24/GarwbjFr lGNp/MvI/nWrF3Abt1sBj2riwyjlxaPeftDaSdzrQviR6cPLtDuPdNlH/V2Hl27bDOeL b+Vw== X-Forwarded-Encrypted: i=1; AJvYcCUmiSWINati1hQ4oUWGHomKuGANF7YP0YCWHsf+mEw0uNWDSQeqI3B3+GvO4pbGJNumrUaakwrGDRBUX4bKxAa9@lists.infradead.org X-Gm-Message-State: AOJu0YwX2tnux/v55VnC7KTkRAJZLv2CvmG3qGlY4pYa3/EEhvaYsl0x pshYHIub7BTiNuWclVyG56OlQnMzXmorov3ZVu5BLwkzSDe7NN5fb4AIlGkjkLxTf98DNILg6g= = X-Google-Smtp-Source: AGHT+IE6bHiPzyDuSNjh1OdQCzS5lebQOdEcH1nt2Xe9SkNJCG2uKeQglvcRSThYGjxDUfSnU0jOLPC3Hg== X-Received: from wmbbi13.prod.google.com ([2002:a05:600c:3d8d:b0:43c:ec4d:6037]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600c:4f56:b0:43c:fd72:f028 with SMTP id 5b1f17b1804b1-43d1ecd2ddamr26160465e9.29.1741951116586; Fri, 14 Mar 2025 04:18:36 -0700 (PDT) Date: Fri, 14 Mar 2025 11:18:29 +0000 In-Reply-To: <20250314111832.4137161-1-tabba@google.com> Mime-Version: 1.0 References: <20250314111832.4137161-1-tabba@google.com> X-Mailer: git-send-email 2.49.0.rc1.451.g8f38331e32-goog Message-ID: <20250314111832.4137161-2-tabba@google.com> Subject: [PATCH v3 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-20250314_041838_167383_F149C1CB X-CRM114-Status: GOOD ( 14.04 ) 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. Reviewed-by: Marc Zyngier 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 Fri Mar 14 11:18:30 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 14016670 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 34B63C282EC for ; Fri, 14 Mar 2025 11:25:13 +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=yVHCPBxikyr6bz94T8wXYfnynt+o8o3vwTA2lD3uomo=; b=v7V83Sl/hVpHZQtd2dUHOEjx9C xIdKIu+1kd4qnBPd7zZfCRfUTSipna3OqK1RyOPffSKdQKsjiKy5jz/ZSHtb2nkh4PAG/YpurOfug 3tXCdpj31RohRknL8mpM6t10HNeqCSI6ihA1g1gD2a6HsNdivOwjwghVSC03Aifzf2wcBqXf8PlrI XOUTt7tHatEdgF8zwAey39GTtxlTGXlA8rJ9liS0DzCsEgQ6mTCr3Py01SQXNgdKObBazPinOHFj4 W4InBYOsem9BpWaO9YYy+0vqpGtagYJj5i93KIvy4L8YdC8xaJh4sOXQYTFM7BjnVMLlOVFmqT3sE Ot2K2UyA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tt39y-0000000Dzb3-49EL; Fri, 14 Mar 2025 11:25:02 +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 1tt33p-0000000Dycy-2SAF for linux-arm-kernel@lists.infradead.org; Fri, 14 Mar 2025 11:18:42 +0000 Received: by mail-wr1-x44a.google.com with SMTP id ffacd0b85a97d-39134c762ebso892065f8f.0 for ; Fri, 14 Mar 2025 04:18:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1741951119; x=1742555919; 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=yVHCPBxikyr6bz94T8wXYfnynt+o8o3vwTA2lD3uomo=; b=PrdCGMDlbDWh1p9ipoMDZ8EDnGh6+QQRl9mDFez7QpQyW4mc/SWx2rCznoLZlwJp5g EEB3dmkHwknCikDgYldjJIyiRtee1R2BYxkVGxR03GCMcf2iSGqJvWbnFgt8jqM+IQ/t ViQpPPC/kLhavBHkLV3/q4j64cY3cDuVip9SV/nhuULQiB/lupZMdmyeFH8KRkJeqW+A g2exWX3pyTbPVFkfw0KJ+UnXrG3lvOF7H9cAzk5BKvL6E1ExI15/7eV3tjFjO1Us4CUP +tHdxdXB2qkRQsOuA8atYqej/pO+QwmgqDUTuBU2SPZb+N0f1S4KJIfvd8Jno5/imWok Ku8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741951119; x=1742555919; 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=yVHCPBxikyr6bz94T8wXYfnynt+o8o3vwTA2lD3uomo=; b=OjDiWw59MGS0C2i6Td9IEkltB5iHTxuCANC4nJWGOVAbv6yrozMVvnAVH0ivU2TP12 xXYFjYcqG8G1NAOvFFE6FVl3jlsq2t0WQEIj80BwvMvDpx4KsfZVJb1Q6aFqW8CmiOFV NjgXp43RVaFd22Mzx6Tuvh0FH9nrJVFbGUnFYoDRDe4bXCJaAHb6t8nr9ZppGPqCfJLh W6ggFLZz7FGybx7DkzcpH4HIU/XK6wXrnBJLLWhdveFNdljk/kcdqxlJzsNSQNOxP3Vm gvQoyWizDyGh/tUfJGeBrsBOMh1aKkWBN0cJ1dsEf4T6KBL4Pa1sftroFB8eFBbMWVU5 Wq1g== X-Forwarded-Encrypted: i=1; AJvYcCVrehDYTbFSptqB5lTZArMKJv0RoJTPV4H4gUZVDCcj7QgTrNps92Vq12rykziKAjuM/oscWAjRzd3wuqayKNY/@lists.infradead.org X-Gm-Message-State: AOJu0Yz8JCch9yihMDoCkjMORe+UODOP713dXHip4hI4Q+pwq+wMe+7H t2CvF4BpFx3hX/1/8jArR8DP07P/fZaSTjwAjq+hE1U8x0Z5fAK0fExcnpxJDPXjd+3xznNpfg= = X-Google-Smtp-Source: AGHT+IFH3SuJ1uC+yXMAZ9jkckywHcWe5WA9zfg61vMBkH7bJ1po2Sm1vehb5nwh9MKJnjPHma3sjh1qZQ== X-Received: from wmrs15.prod.google.com ([2002:a05:600c:384f:b0:43d:c77:3fd8]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a5d:59af:0:b0:390:f6aa:4e80 with SMTP id ffacd0b85a97d-397200ac22fmr2439040f8f.53.1741951119711; Fri, 14 Mar 2025 04:18:39 -0700 (PDT) Date: Fri, 14 Mar 2025 11:18:30 +0000 In-Reply-To: <20250314111832.4137161-1-tabba@google.com> Mime-Version: 1.0 References: <20250314111832.4137161-1-tabba@google.com> X-Mailer: git-send-email 2.49.0.rc1.451.g8f38331e32-goog Message-ID: <20250314111832.4137161-3-tabba@google.com> Subject: [PATCH v3 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-20250314_041841_623012_4681FAE1 X-CRM114-Status: GOOD ( 12.48 ) 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. Reviewed-by: Marc Zyngier 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 Fri Mar 14 11:18:31 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 14016671 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 5CBAFC282EC for ; Fri, 14 Mar 2025 11:26:54 +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=82vwVg0CBFLxNk1y97bWD8aRM0sls0IM+3B5nN7emI4=; b=kWu1msA8xTqtsT9NwrsQGJvAiF PKawi/ROlKeeKGpN132Jn6iddHTsRwq1m5Pn0XS0SxiTkdIZ27iyhy+FtzUN3Td6sowqxD+ipatzZ TZdfgltxSqYYSRkSQh1fnGY44aIMmHyKlndZygGMWTeMXNwKk5L+Hd8h/n9tUZTUdb5YKgcG+5ZK0 bwIl81YM8bQiReQLidZfyLDpbYugQHGTDlza0++IoTlaOZAHiq8Ut5ZEgWWIDR63/Fbf8F3uKSYj4 sHLNsSMvQX7GrnvKedkz0nT0fv53zWXtiZeN4TpvDnLIP57xqF0gdxhybU8uP6GipnFkcdRq+Q697 OwLMkmAQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tt3Bc-0000000DzqU-2oc3; Fri, 14 Mar 2025 11:26:44 +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 1tt33s-0000000Dydd-0DnD for linux-arm-kernel@lists.infradead.org; Fri, 14 Mar 2025 11:18:45 +0000 Received: by mail-wm1-x34a.google.com with SMTP id 5b1f17b1804b1-43bd0586b86so15294045e9.3 for ; Fri, 14 Mar 2025 04:18:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1741951122; x=1742555922; 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=82vwVg0CBFLxNk1y97bWD8aRM0sls0IM+3B5nN7emI4=; b=RspgiEGXD4hgk6EdknSEKQI16VgnEd8veeoMbH2YQjDRAZis2snzXNP486zaTvYl+V Rd+66uUx95IUiY/g/ty7oOh9OwXVyYFa9noOFTfpGO3q/TxNtPEgLnjRgRrSVSw54j9N vKHuovDRTSoCoh5zB4noSufVOTjt7emOOBXVt/WcQZ4K8qj0HoGorJIAfxaR/x88f9NG T+SPv2eGurMeOclzE20VrTVV6mTPStx+ccBo2NH8vjdG/KaUPayioxyoSqfXfBNrnClq GCYqP5KBl5fBuULkQhI+1TATXGmVbD0AInFYP5OnF5Gt0xkvb/PzwdQYK2poawp9uh8a 3/Zg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741951122; x=1742555922; 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=82vwVg0CBFLxNk1y97bWD8aRM0sls0IM+3B5nN7emI4=; b=LHVrBd1xr3cKLbKf+tz52iWo3IckPqkrI2yRxHdazsjr9sDQUxsfgPUl8co5Ub1B5h biYDKIu0LOGrsL6nYRoHEXwPJJBCh4d4CMCojcAkP9hmm1lQyntk0MDQxahoUQl1NnKr T5cxvuFOG9mvbqP06ApH844xbzcoIQqQFEiY9pXFUumEzZy5NCoD9gAYMXum/Qph33yq Hi5x6t1cG1IMGXPdpBu87SMBDZZqONRc0a/eYaa11cejZvjJZhF8XFTMlIH9sJba8ktf UwAFH0Hc446+/StrbNh4XMEFaktNxtDellIJIbNFPmyyoiA0qL+9OUi1aMTC7TdGQwG+ uw6Q== X-Forwarded-Encrypted: i=1; AJvYcCXT5BIHyNckbeDEod718cPwb3lPKAf37uXL3to0K12ojg8DmRxw7hxC9IhUyN7WGbyuIrRr/P81+qz0YfjkJ4V9@lists.infradead.org X-Gm-Message-State: AOJu0YxuzXeymcLXHkkGoM3p0fREcM+d8KcDiymrxMnqEGB4mL8WE3eu MiX9mYvatNrdW4K9CS1LulrTX8wiXJemseZB3TY3jCzoBURwpMi9E6GqkVBN4ywv1lbWJ+Zyng= = X-Google-Smtp-Source: AGHT+IFgy0IRKYEui6JFldvaggSnbklu2RRtgsoq5WhXW+8cqly4bSvIDl1pRV1tvV13ltYjlwnhY564FA== X-Received: from wmbep16.prod.google.com ([2002:a05:600c:8410:b0:43c:f122:1874]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:600d:e:b0:43c:ec28:d303 with SMTP id 5b1f17b1804b1-43d1f0a4287mr27609165e9.5.1741951122171; Fri, 14 Mar 2025 04:18:42 -0700 (PDT) Date: Fri, 14 Mar 2025 11:18:31 +0000 In-Reply-To: <20250314111832.4137161-1-tabba@google.com> Mime-Version: 1.0 References: <20250314111832.4137161-1-tabba@google.com> X-Mailer: git-send-email 2.49.0.rc1.451.g8f38331e32-goog Message-ID: <20250314111832.4137161-4-tabba@google.com> Subject: [PATCH v3 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-20250314_041844_090149_19541AFE X-CRM114-Status: GOOD ( 13.88 ) 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. Acked-by: Will Deacon Reviewed-by: Marc Zyngier 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..74cf5d87e77b 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; + 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 Fri Mar 14 11:18:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fuad Tabba X-Patchwork-Id: 14016672 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 1BAA9C282EC for ; Fri, 14 Mar 2025 11:28: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: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=nQHS6edakeTMkoUtKqh0HQvA5buiRQWe1WYXeTlyIUk=; b=2YyrhwtEGovuZh/o5kqRet4OJS 7SkL4k+iWrPaxSeiZY14gSSKKmb1BCukt4lEsTJvl7fwzDe20v08BJEx7qLYFQbC3udTGs5vvNUVG SZgRhpTO2OgEJVosXahffYrB944aGBspn0V0YoPqFewaUhVPIwAFIyPVPwSQDAjd2woejR9rk9toA 8D7cmHfieAD+BAH01L8mon4AAqWECePV+LSwNhLGtNEkVeBHL8hVFmErtPuhmdBuq3poh0JPeo20+ nE2cTcXhFDJ+e0MKTzGYuZHo32YQRna79I8Mo4tZ/aUKlBoKjpeiiiTzdrcv/snqg6aRO8Ua93oPE 2XnQlLIw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tt3DH-0000000E06q-1JVx; Fri, 14 Mar 2025 11:28:27 +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 1tt33t-0000000Dyef-42NV for linux-arm-kernel@lists.infradead.org; Fri, 14 Mar 2025 11:18:47 +0000 Received: by mail-wr1-x449.google.com with SMTP id ffacd0b85a97d-3913f97d115so997470f8f.0 for ; Fri, 14 Mar 2025 04:18:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1741951124; x=1742555924; 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=nQHS6edakeTMkoUtKqh0HQvA5buiRQWe1WYXeTlyIUk=; b=c9t1kN3WfR1aJc3y2tB7tc8ucvXB2/RrZqtlzqw1iVwkudl5SlNBSmo5/yYesBAEG1 53xg2EKMOyr4bJcaoaQOw0zSIFIJ2YJBwb+3rYvjqAm6jhWXb6d9J+/tKEDu03B5ZInr dzSmGXYmWzCDkG3sU/ZwX+/vBCeBQ4RddrzKbLv4MBKX875bmhUvCU+nF58H6f04Nlei pNbEhbC3y+Vt29SFlPKLL6RJBqnCjMlvk35wlVPeXjhhYcJE0sKmgagP9hyfQuSovJso XS3+AawsJWU9n/nNnUVqW2gkffNGLwqGEe+R+iQ7T3l+L4fuf+IirIBfl769eQRDzWy2 hPNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741951124; x=1742555924; 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=nQHS6edakeTMkoUtKqh0HQvA5buiRQWe1WYXeTlyIUk=; b=h4WNTCQy3H6ZNUiSx5Uaqe6D9Jro9bn/8TX2xnbp94cDRNSImyVOxfmcq6wjaJeo7P MbwBfvGtdf7X9ZoIEHU7rTO6pnyBdPoAlRrHaq0jKIxtue71fYI4oLWv3g/JJf0y/b4j f9VdiZKhaQgw+O/SsBICUJSLco1iS2irW++0+UpKWsQ8dHboq4KLwIx0Qyqy7UNowqM/ fOqDhSHtUFf6ZHcxqtMsgJnKs3S+9qfD1ss26DSIx9bwevSyrSMT1GPNiDTWAz+xCNqo ye0wf2inVH5JoUA4s1Q3TrshTRw6xnAZyPiULqaPwge4ykUpA8ngXApl/qPNWdGycxsZ 8j3w== X-Forwarded-Encrypted: i=1; AJvYcCXzmCGg9qqhxBT5TN3ZKwc9oxi9ahLpiE/FW3VNfaibyMsfFnMGjA4sxoRE4v6bfR8RAefE2fMuGhoRVJiSG5ZC@lists.infradead.org X-Gm-Message-State: AOJu0YwWQb2sAyOWazUsBgM6eAlOmFkE5kWKeVGEK2SS1YT40w5q+Nz/ K9XNe2IBLpoUnYjvX2AV/bu8pp0gFpbjrR4JaUvWD4LN2K9AYxlhRU2OvsP+x1dIl0Md4k8MNg= = X-Google-Smtp-Source: AGHT+IFYtQOOphKfLoOaQyXRnKRzCcMMNh/zGKLdmVfOk340KK97aCzghkWNQExmuTK4+Cq9Ck3MWM7VWg== X-Received: from wmrn15.prod.google.com ([2002:a05:600c:500f:b0:43c:f03d:18aa]) (user=tabba job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6000:4026:b0:391:a74:d7e2 with SMTP id ffacd0b85a97d-395b9b10d93mr6955810f8f.26.1741951124121; Fri, 14 Mar 2025 04:18:44 -0700 (PDT) Date: Fri, 14 Mar 2025 11:18:32 +0000 In-Reply-To: <20250314111832.4137161-1-tabba@google.com> Mime-Version: 1.0 References: <20250314111832.4137161-1-tabba@google.com> X-Mailer: git-send-email 2.49.0.rc1.451.g8f38331e32-goog Message-ID: <20250314111832.4137161-5-tabba@google.com> Subject: [PATCH v3 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-20250314_041846_016214_B5DE4A15 X-CRM114-Status: GOOD ( 23.06 ) 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. Acked-by: Will Deacon Reviewed-by: Marc Zyngier 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 d919557af5e5..31b21cf8118a 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 0160b4924351..6acd8b924210 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -843,6 +843,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 74cf5d87e77b..fc6b5df309dd 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) 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);