From: Mingwei Zhang mizhang@google.com
commit f1815e0aa770f2127c5df31eb5c2f0e37b60fa77 upstream.
DECOMMISSION the current SEV context if binding an ASID fails after RECEIVE_START. Per AMD's SEV API, RECEIVE_START generates a new guest context and thus needs to be paired with DECOMMISSION:
The RECEIVE_START command is the only command other than the LAUNCH_START command that generates a new guest context and guest handle.
The missing DECOMMISSION can result in subsequent SEV launch failures, as the firmware leaks memory and might not able to allocate more SEV guest contexts in the future.
Note, LAUNCH_START suffered the same bug, but was previously fixed by commit 934002cd660b ("KVM: SVM: Call SEV Guest Decommission if ASID binding fails").
Cc: Alper Gun alpergun@google.com Cc: Borislav Petkov bp@alien8.de Cc: Brijesh Singh brijesh.singh@amd.com Cc: David Rienjes rientjes@google.com Cc: Marc Orr marcorr@google.com Cc: John Allen john.allen@amd.com Cc: Peter Gonda pgonda@google.com Cc: Sean Christopherson seanjc@google.com Cc: Tom Lendacky thomas.lendacky@amd.com Cc: Vipin Sharma vipinsh@google.com Cc: stable@vger.kernel.org Reviewed-by: Marc Orr marcorr@google.com Acked-by: Brijesh Singh brijesh.singh@amd.com Fixes: af43cbbf954b ("KVM: SVM: Add support for KVM_SEV_RECEIVE_START command") Signed-off-by: Mingwei Zhang mizhang@google.com Reviewed-by: Sean Christopherson seanjc@google.com Message-Id: 20210912181815.3899316-1-mizhang@google.com Signed-off-by: Paolo Bonzini pbonzini@redhat.com Signed-off-by: Greg Kroah-Hartman gregkh@linuxfoundation.org --- arch/x86/kvm/svm/sev.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
--- a/arch/x86/kvm/svm/sev.c +++ b/arch/x86/kvm/svm/sev.c @@ -1405,8 +1405,10 @@ static int sev_receive_start(struct kvm
/* Bind ASID to this guest */ ret = sev_bind_asid(kvm, start.handle, error); - if (ret) + if (ret) { + sev_decommission(start.handle); goto e_free_session; + }
params.handle = start.handle; if (copy_to_user((void __user *)(uintptr_t)argp->data,