All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tom Lendacky <thomas.lendacky@amd.com>
To: Sean Christopherson <seanjc@google.com>,
	Paolo Bonzini <pbonzini@redhat.com>
Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
	Naveen N Rao <naveen@kernel.org>,
	Kim Phillips <kim.phillips@amd.com>,
	Alexey Kardashevskiy <aik@amd.com>
Subject: Re: [PATCH 09/10] KVM: SVM: Use guard(mutex) to simplify SNP vCPU state updates
Date: Mon, 24 Feb 2025 16:57:12 -0600	[thread overview]
Message-ID: <11daeb05-b33d-01a4-e84d-40148943910f@amd.com> (raw)
In-Reply-To: <20250219012705.1495231-10-seanjc@google.com>

On 2/18/25 19:27, Sean Christopherson wrote:
> Use guard(mutex) in sev_snp_init_protected_guest_state() and pull in its
> lock-protected inner helper.  Without an unlock trampoline (and even with
> one), there is no real need for an inner helper.  Eliminating the helper
> also avoids having to fixup the open coded "lockdep" WARN_ON().
> 
> Opportunistically drop the error message if KVM can't obtain the pfn for
> the new target VMSA.  The error message provides zero information that
> can't be gleaned from the fact that the vCPU is stuck.

Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com>

> 
> Signed-off-by: Sean Christopherson <seanjc@google.com>
> ---
>  arch/x86/kvm/svm/sev.c | 122 ++++++++++++++++++-----------------------
>  1 file changed, 53 insertions(+), 69 deletions(-)
> 
> diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c
> index 3a531232c3a1..15c324b61b24 100644
> --- a/arch/x86/kvm/svm/sev.c
> +++ b/arch/x86/kvm/svm/sev.c
> @@ -3839,11 +3839,26 @@ static int snp_begin_psc(struct vcpu_svm *svm, struct psc_buffer *psc)
>  	BUG();
>  }
>  
> -static int __sev_snp_update_protected_guest_state(struct kvm_vcpu *vcpu)
> +/*
> + * Invoked as part of svm_vcpu_reset() processing of an init event.
> + */
> +void sev_snp_init_protected_guest_state(struct kvm_vcpu *vcpu)
>  {
>  	struct vcpu_svm *svm = to_svm(vcpu);
> +	struct kvm_memory_slot *slot;
> +	struct page *page;
> +	kvm_pfn_t pfn;
> +	gfn_t gfn;
>  
> -	WARN_ON(!mutex_is_locked(&svm->sev_es.snp_vmsa_mutex));
> +	if (!sev_snp_guest(vcpu->kvm))
> +		return;
> +
> +	guard(mutex)(&svm->sev_es.snp_vmsa_mutex);
> +
> +	if (!svm->sev_es.snp_ap_waiting_for_reset)
> +		return;
> +
> +	svm->sev_es.snp_ap_waiting_for_reset = false;
>  
>  	/* Mark the vCPU as offline and not runnable */
>  	vcpu->arch.pv.pv_unhalted = false;
> @@ -3858,78 +3873,47 @@ static int __sev_snp_update_protected_guest_state(struct kvm_vcpu *vcpu)
>  	 */
>  	vmcb_mark_all_dirty(svm->vmcb);
>  
> -	if (VALID_PAGE(svm->sev_es.snp_vmsa_gpa)) {
> -		gfn_t gfn = gpa_to_gfn(svm->sev_es.snp_vmsa_gpa);
> -		struct kvm_memory_slot *slot;
> -		struct page *page;
> -		kvm_pfn_t pfn;
> -
> -		slot = gfn_to_memslot(vcpu->kvm, gfn);
> -		if (!slot)
> -			return -EINVAL;
> -
> -		/*
> -		 * The new VMSA will be private memory guest memory, so
> -		 * retrieve the PFN from the gmem backend.
> -		 */
> -		if (kvm_gmem_get_pfn(vcpu->kvm, slot, gfn, &pfn, &page, NULL))
> -			return -EINVAL;
> -
> -		/*
> -		 * From this point forward, the VMSA will always be a
> -		 * guest-mapped page rather than the initial one allocated
> -		 * by KVM in svm->sev_es.vmsa. In theory, svm->sev_es.vmsa
> -		 * could be free'd and cleaned up here, but that involves
> -		 * cleanups like wbinvd_on_all_cpus() which would ideally
> -		 * be handled during teardown rather than guest boot.
> -		 * Deferring that also allows the existing logic for SEV-ES
> -		 * VMSAs to be re-used with minimal SNP-specific changes.
> -		 */
> -		svm->sev_es.snp_has_guest_vmsa = true;
> -
> -		/* Use the new VMSA */
> -		svm->vmcb->control.vmsa_pa = pfn_to_hpa(pfn);
> -
> -		/* Mark the vCPU as runnable */
> -		kvm_set_mp_state(vcpu, KVM_MP_STATE_RUNNABLE);
> -
> -		svm->sev_es.snp_vmsa_gpa = INVALID_PAGE;
> -
> -		/*
> -		 * gmem pages aren't currently migratable, but if this ever
> -		 * changes then care should be taken to ensure
> -		 * svm->sev_es.vmsa is pinned through some other means.
> -		 */
> -		kvm_release_page_clean(page);
> -	}
> -
> -	return 0;
> -}
> -
> -/*
> - * Invoked as part of svm_vcpu_reset() processing of an init event.
> - */
> -void sev_snp_init_protected_guest_state(struct kvm_vcpu *vcpu)
> -{
> -	struct vcpu_svm *svm = to_svm(vcpu);
> -	int ret;
> -
> -	if (!sev_snp_guest(vcpu->kvm))
> +	if (!VALID_PAGE(svm->sev_es.snp_vmsa_gpa))
>  		return;
>  
> -	mutex_lock(&svm->sev_es.snp_vmsa_mutex);
> +	gfn = gpa_to_gfn(svm->sev_es.snp_vmsa_gpa);
>  
> -	if (!svm->sev_es.snp_ap_waiting_for_reset)
> -		goto unlock;
> -
> -	svm->sev_es.snp_ap_waiting_for_reset = false;
> +	slot = gfn_to_memslot(vcpu->kvm, gfn);
> +	if (!slot)
> +		return;
>  
> -	ret = __sev_snp_update_protected_guest_state(vcpu);
> -	if (ret)
> -		vcpu_unimpl(vcpu, "snp: AP state update on init failed\n");
> +	/*
> +	 * The new VMSA will be private memory guest memory, so retrieve the
> +	 * PFN from the gmem backend.
> +	 */
> +	if (kvm_gmem_get_pfn(vcpu->kvm, slot, gfn, &pfn, &page, NULL))
> +		return;
>  
> -unlock:
> -	mutex_unlock(&svm->sev_es.snp_vmsa_mutex);
> +	/*
> +	 * From this point forward, the VMSA will always be a guest-mapped page
> +	 * rather than the initial one allocated by KVM in svm->sev_es.vmsa. In
> +	 * theory, svm->sev_es.vmsa could be free'd and cleaned up here, but
> +	 * that involves cleanups like wbinvd_on_all_cpus() which would ideally
> +	 * be handled during teardown rather than guest boot.  Deferring that
> +	 * also allows the existing logic for SEV-ES VMSAs to be re-used with
> +	 * minimal SNP-specific changes.
> +	 */
> +	svm->sev_es.snp_has_guest_vmsa = true;
> +
> +	/* Use the new VMSA */
> +	svm->vmcb->control.vmsa_pa = pfn_to_hpa(pfn);
> +
> +	/* Mark the vCPU as runnable */
> +	kvm_set_mp_state(vcpu, KVM_MP_STATE_RUNNABLE);
> +
> +	svm->sev_es.snp_vmsa_gpa = INVALID_PAGE;
> +
> +	/*
> +	 * gmem pages aren't currently migratable, but if this ever changes
> +	 * then care should be taken to ensure svm->sev_es.vmsa is pinned
> +	 * through some other means.
> +	 */
> +	kvm_release_page_clean(page);
>  }
>  
>  static int sev_snp_ap_creation(struct vcpu_svm *svm)

  reply	other threads:[~2025-02-24 22:57 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-02-19  1:26 [PATCH 00/10] KVM: SVM: Attempt to cleanup SEV_FEATURES Sean Christopherson
2025-02-19  1:26 ` [PATCH 01/10] KVM: SVM: Save host DR masks but NOT DRs on CPUs with DebugSwap Sean Christopherson
2025-02-24 19:38   ` Tom Lendacky
2025-02-25  2:22   ` Kim Phillips
2025-02-25 14:12     ` Tom Lendacky
2025-02-19  1:26 ` [PATCH 02/10] KVM: SVM: Don't rely on DebugSwap to restore host DR0..DR3 Sean Christopherson
2025-02-24 20:32   ` Tom Lendacky
2025-02-24 22:32     ` Sean Christopherson
2025-02-19  1:26 ` [PATCH 03/10] KVM: SVM: Terminate the VM if a SEV-ES+ guest is run with an invalid VMSA Sean Christopherson
2025-02-24 21:03   ` Tom Lendacky
2025-02-24 22:55     ` Sean Christopherson
2025-02-24 23:55       ` Tom Lendacky
2025-02-25  0:54         ` Sean Christopherson
2025-02-25  1:20           ` Sean Christopherson
2025-02-25 14:42           ` Tom Lendacky
2025-02-19  1:26 ` [PATCH 04/10] KVM: SVM: Don't change target vCPU state on AP Creation VMGEXIT error Sean Christopherson
2025-02-24 21:31   ` Tom Lendacky
2025-02-19  1:27 ` [PATCH 05/10] KVM: SVM: Require AP's "requested" SEV_FEATURES to match KVM's view Sean Christopherson
2025-02-24 21:46   ` Tom Lendacky
2025-02-19  1:27 ` [PATCH 06/10] KVM: SVM: Simplify request+kick logic in SNP AP Creation handling Sean Christopherson
2025-02-19  6:19   ` Gupta, Pankaj
2025-02-24 21:48   ` Tom Lendacky
2025-02-19  1:27 ` [PATCH 07/10] KVM: SVM: Use guard(mutex) to simplify SNP AP Creation error handling Sean Christopherson
2025-02-24 21:49   ` Tom Lendacky
2025-02-19  1:27 ` [PATCH 08/10] KVM: SVM: Mark VMCB dirty before processing incoming snp_vmsa_gpa Sean Christopherson
2025-02-24 21:58   ` Tom Lendacky
2025-02-19  1:27 ` [PATCH 09/10] KVM: SVM: Use guard(mutex) to simplify SNP vCPU state updates Sean Christopherson
2025-02-24 22:57   ` Tom Lendacky [this message]
2025-02-19  1:27 ` [PATCH 10/10] KVM: SVM: Invalidate "next" SNP VMSA GPA even on failure Sean Christopherson
2025-02-25  0:00   ` Tom Lendacky
2025-02-20 22:51 ` [PATCH 00/10] KVM: SVM: Attempt to cleanup SEV_FEATURES Tom Lendacky
2025-02-25  0:02   ` Tom Lendacky
2025-02-25  2:21     ` Kim Phillips

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=11daeb05-b33d-01a4-e84d-40148943910f@amd.com \
    --to=thomas.lendacky@amd.com \
    --cc=aik@amd.com \
    --cc=kim.phillips@amd.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=naveen@kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=seanjc@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.