Messages in this thread | | | Date | Wed, 26 Apr 2023 13:02:46 -0500 | Subject | Re: [PATCH RFC v8 34/56] KVM: SVM: Add KVM_SEV_SNP_LAUNCH_START command | From | Tom Lendacky <> |
| |
On 4/26/23 12:06, Sabin Rapan wrote: > On 20.02.2023 20:38, Michael Roth wrote: >> From: Brijesh Singh <brijesh.singh@amd.com> >> >> >> +static int snp_decommission_context(struct kvm *kvm) >> +{ >> + struct kvm_sev_info *sev = &to_kvm_svm(kvm)->sev_info; >> + struct sev_data_snp_addr data = {}; >> + int ret; >> + >> + /* If context is not created then do nothing */ >> + if (!sev->snp_context) >> + return 0; >> + >> + data.gctx_paddr = __sme_pa(sev->snp_context); >> + ret = sev_do_cmd(SEV_CMD_SNP_DECOMMISSION, &data, NULL); >> + if (WARN_ONCE(ret, "failed to release guest context")) >> + return ret; >> + >> + /* free the context page now */ >> + snp_free_firmware_page(sev->snp_context); >> + sev->snp_context = NULL; >> + >> + return 0; >> +} >> + > > Even though it's not documented, SNP_DECOMMISSION seems to clear the > WBINVD indicator just like DEACTIVATE does for SEV. > Won't ASID recycling race with SNP_DECOMMISSION if the latter isn't > guarded with sev_deactivate_lock?
Good catch, yes, this needs to use the sev_deactivate_lock around the DECOMMISSION command.
Thanks, Tom
> > >> void sev_vm_destroy(struct kvm *kvm) >> { >> struct kvm_sev_info *sev = &to_kvm_svm(kvm)->sev_info; >> @@ -2333,7 +2440,15 @@ void sev_vm_destroy(struct kvm *kvm) >> } >> } >> >> - sev_unbind_asid(kvm, sev->handle); >> + if (sev_snp_guest(kvm)) { >> + if (snp_decommission_context(kvm)) { >> + WARN_ONCE(1, "Failed to free SNP guest context, leaking asid!\n"); >> + return; >> + } >> + } else { >> + sev_unbind_asid(kvm, sev->handle); >> + } >> + >> sev_asid_free(sev); >> } >> > > > > Amazon Development Center (Romania) S.R.L. registered office: 27A Sf. Lazar Street, UBC5, floor 2, Iasi, Iasi County, 700045, Romania. Registered in Romania. Registration number J22/2621/2005.
| |