FAILED: patch "[PATCH] KVM: SVM: Call SEV Guest Decommission if ASID binding fails" failed to apply to 5.10-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.10-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]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 934002cd660b035b926438244b4294e647507e13 Mon Sep 17 00:00:00 2001
From: Alper Gun <[email protected]>
Date: Thu, 10 Jun 2021 17:46:04 +0000
Subject: [PATCH] KVM: SVM: Call SEV Guest Decommission if ASID binding fails
Send SEV_CMD_DECOMMISSION command to PSP firmware if ASID binding fails. If a failure happens after a successful LAUNCH_START command, a decommission command should be executed. Otherwise, guest context will be unfreed inside the AMD SP. After the firmware will not have memory to allocate more SEV guest context, LAUNCH_START command will begin to fail with SEV_RET_RESOURCE_LIMIT error.
The existing code calls decommission inside sev_unbind_asid, but it is not called if a failure happens before guest activation succeeds. If sev_bind_asid fails, decommission is never called. PSP firmware has a limit for the number of guests. If sev_asid_binding fails many times, PSP firmware will not have resources to create another guest context.
Message-Id: <[email protected]>
arch/x86/kvm/svm/sev.c +15 -5
@@ -199,9 +199,19 @@ static void sev_asid_free(struct kvm_sev_info *sev) sev->misc_cg =NULL ; } -static void sev_unbind_asid (struct kvm *kvm,unsigned int handle) +static void sev_decommission (unsigned int handle) {struct sev_data_decommission decommission; + +if (!handle) +return ; + + decommission.handle = handle; +sev_guest_decommission (&decommission,NULL ); +} + +static void sev_unbind_asid (struct kvm *kvm,unsigned int handle) +{struct sev_data_deactivate deactivate;if (!handle)
@@ -214,9 +224,7 @@ static void sev_unbind_asid(struct kvm *kvm, unsigned int handle)sev_guest_deactivate (&deactivate,NULL );up_read (&sev_deactivate_lock); -/* decommission handle */ - decommission.handle = handle; -sev_guest_decommission (&decommission,NULL ); +sev_decommission (handle); }static int sev_guest_init (struct kvm *kvm,struct kvm_sev_cmd *argp)
@@ -341,8 +349,10 @@ static int sev_launch_start(struct kvm *kvm, struct kvm_sev_cmd *argp)/* 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; + }/* return handle to userspace */ params.handle = start.handle;