FAILED: patch "[PATCH] KVM: SEV: Unmap and unpin the GHCB as needed on vCPU free" failed to apply to 6.1-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x db38bcb3311053954f62b865cd2d86e164b04351
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026061520-nutrient-overripe-e496@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From db38bcb3311053954f62b865cd2d86e164b04351 Mon Sep 17 00:00:00 2001
From: Sean Christopherson <[email protected]>
Date: Fri, 29 May 2026 20:35:42 +0200
Subject: [PATCH] KVM: SEV: Unmap and unpin the GHCB as needed on vCPU free
Unmap and unpin the GHCB as needed when freeing a vCPU. If the VM is destroyed after mapping+pinning the GHCB on #VMGEXIT, without re-running the vCPU, KVM will effectively leak the GHCB and any mappings created for the GHCB.
Message-ID: <[email protected]>
Message-ID: <[email protected]>
arch/x86/kvm/svm/sev.c +16 -10
@@ -3552,6 +3552,20 @@ static int sev_es_validate_vmgexit(struct vcpu_svm *svm)return 1 ; } +static void __sev_es_unmap_ghcb (struct vcpu_svm *svm) +{ +if (svm->sev_es.ghcb_sa_free) { +kvfree (svm->sev_es.ghcb_sa); + svm->sev_es.ghcb_sa =NULL ; + svm->sev_es.ghcb_sa_free = false; + } + +if (svm->sev_es.ghcb) { +kvm_vcpu_unmap (&svm->vcpu, &svm->sev_es.ghcb_map); + svm->sev_es.ghcb =NULL ; + } +} +void sev_es_unmap_ghcb (struct vcpu_svm *svm) {/* Clear any indication that the vCPU is in a type of AP Reset Hold */
@@ -3570,18 +3584,11 @@ void sev_es_unmap_ghcb(struct vcpu_svm *svm) svm->sev_es.ghcb_sa_sync = false; } -if (svm->sev_es.ghcb_sa_free) { -kvfree (svm->sev_es.ghcb_sa); - svm->sev_es.ghcb_sa =NULL ; - svm->sev_es.ghcb_sa_free = false; - } -trace_kvm_vmgexit_exit (svm->vcpu.vcpu_id, svm->sev_es.ghcb);sev_es_sync_to_ghcb (svm); -kvm_vcpu_unmap (&svm->vcpu, &svm->sev_es.ghcb_map); - svm->sev_es.ghcb =NULL ; +__sev_es_unmap_ghcb (svm); }void sev_free_vcpu (struct kvm_vcpu *vcpu)
@@ -3611,8 +3618,7 @@ void sev_free_vcpu(struct kvm_vcpu *vcpu)__free_page (virt_to_page (svm->sev_es.vmsa)); skip_vmsa_free: -if (svm->sev_es.ghcb_sa_free) -kvfree (svm->sev_es.ghcb_sa); +__sev_es_unmap_ghcb (svm); }int pre_sev_run (struct vcpu_svm *svm,int cpu)