Message ID | 20210628211054.61528-1-alpergun@google.com |
---|---|
State | New |
Headers | show |
Series | [5.4] KVM: SVM: Call SEV Guest Decommission if ASID binding fails | expand |
On Mon, Jun 28, 2021 at 09:10:54PM +0000, Alper Gun wrote: > commit 934002cd660b035b926438244b4294e647507e13 upstream. > > 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. > > Cc: stable@vger.kernel.org > Fixes: 59414c989220 ("KVM: SVM: Add support for KVM_SEV_LAUNCH_START command") > Reported-by: Peter Gonda <pgonda@google.com> > Signed-off-by: Alper Gun <alpergun@google.com> > Reviewed-by: Marc Orr <marcorr@google.com> > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> > Message-Id: <20210610174604.2554090-1-alpergun@google.com> Message-id? Odd... > --- > arch/x86/kvm/svm.c | 32 +++++++++++++++++++++----------- > 1 file changed, 21 insertions(+), 11 deletions(-) <snip> Can you also provide working backports for the newer kernel trees as well? We would need this in 5.10 and 5.12, right? thanks, greg k-h
On 05/07/21 09:15, Greg KH wrote: > On Mon, Jun 28, 2021 at 09:10:54PM +0000, Alper Gun wrote: >> commit 934002cd660b035b926438244b4294e647507e13 upstream. >> >> 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. >> >> Cc: stable@vger.kernel.org >> Fixes: 59414c989220 ("KVM: SVM: Add support for KVM_SEV_LAUNCH_START command") >> Reported-by: Peter Gonda <pgonda@google.com> >> Signed-off-by: Alper Gun <alpergun@google.com> >> Reviewed-by: Marc Orr <marcorr@google.com> >> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> >> Message-Id: <20210610174604.2554090-1-alpergun@google.com> > > Message-id? Odd... Not that much, see "git log -- drivers | grep Message-Id". A link to lore.kernel.org is getting more popular these days, but Message-Id is what "git am" knows about. >> --- >> arch/x86/kvm/svm.c | 32 +++++++++++++++++++++----------- >> 1 file changed, 21 insertions(+), 11 deletions(-) > > <snip> > > Can you also provide working backports for the newer kernel trees as > well? We would need this in 5.10 and 5.12, right? Already queued: https://lore.kernel.org/stable/20210628141828.31757-102-sashal@kernel.org/ for 5.12 https://lore.kernel.org/stable/20210628142607.32218-94-sashal@kernel.org/ for 5.10 For this one: Acked-by: Paolo Bonzini <pbonzini@redhat.com> Paolo
On Mon, Jul 05, 2021 at 01:40:39PM +0200, Paolo Bonzini wrote: > On 05/07/21 09:15, Greg KH wrote: > > On Mon, Jun 28, 2021 at 09:10:54PM +0000, Alper Gun wrote: > > > commit 934002cd660b035b926438244b4294e647507e13 upstream. > > > > > > 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. > > > > > > Cc: stable@vger.kernel.org > > > Fixes: 59414c989220 ("KVM: SVM: Add support for KVM_SEV_LAUNCH_START command") > > > Reported-by: Peter Gonda <pgonda@google.com> > > > Signed-off-by: Alper Gun <alpergun@google.com> > > > Reviewed-by: Marc Orr <marcorr@google.com> > > > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> > > > Message-Id: <20210610174604.2554090-1-alpergun@google.com> > > > > Message-id? Odd... > > Not that much, see "git log -- drivers | grep Message-Id". A link to > lore.kernel.org is getting more popular these days, but Message-Id is what > "git am" knows about. > > > > --- > > > arch/x86/kvm/svm.c | 32 +++++++++++++++++++++----------- > > > 1 file changed, 21 insertions(+), 11 deletions(-) > > > > <snip> > > > > Can you also provide working backports for the newer kernel trees as > > well? We would need this in 5.10 and 5.12, right? > > Already queued: > > https://lore.kernel.org/stable/20210628141828.31757-102-sashal@kernel.org/ > for 5.12 > https://lore.kernel.org/stable/20210628142607.32218-94-sashal@kernel.org/ > for 5.10 Ah, you are right, I forgot to update my local tree, my fault. greg k-h
On Mon, Jun 28, 2021 at 09:10:54PM +0000, Alper Gun wrote: > commit 934002cd660b035b926438244b4294e647507e13 upstream. > > 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. > > Cc: stable@vger.kernel.org > Fixes: 59414c989220 ("KVM: SVM: Add support for KVM_SEV_LAUNCH_START command") > Reported-by: Peter Gonda <pgonda@google.com> > Signed-off-by: Alper Gun <alpergun@google.com> > Reviewed-by: Marc Orr <marcorr@google.com> > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> > Message-Id: <20210610174604.2554090-1-alpergun@google.com> > --- > arch/x86/kvm/svm.c | 32 +++++++++++++++++++++----------- > 1 file changed, 21 insertions(+), 11 deletions(-) Now queued up, thanks. greg k-h
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 074cd170912a..aa2da922ca99 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -1794,9 +1794,25 @@ static void sev_asid_free(struct kvm *kvm) __sev_asid_free(sev->asid); } -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 = kzalloc(sizeof(*decommission), GFP_KERNEL); + if (!decommission) + return; + + decommission->handle = handle; + sev_guest_decommission(decommission, NULL); + + kfree(decommission); +} + +static void sev_unbind_asid(struct kvm *kvm, unsigned int handle) +{ struct sev_data_deactivate *data; if (!handle) @@ -1814,15 +1830,7 @@ static void sev_unbind_asid(struct kvm *kvm, unsigned int handle) sev_guest_df_flush(NULL); kfree(data); - decommission = kzalloc(sizeof(*decommission), GFP_KERNEL); - if (!decommission) - return; - - /* decommission handle */ - decommission->handle = handle; - sev_guest_decommission(decommission, NULL); - - kfree(decommission); + sev_decommission(handle); } static struct page **sev_pin_memory(struct kvm *kvm, unsigned long uaddr, @@ -6475,8 +6483,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;