KVM: SVM: Fix off-by-one indexing when nullifying last used SEV VMCB
Use the raw ASID, not ASID-1, when nullifying the last used VMCB when freeing an SEV ASID. The consumer, pre_sev_run(), indexes the array by the raw ASID, thus KVM could get a false negative when checking for a different VMCB if KVM manages to reallocate the same ASID+VMCB combo for a new VM. Note, this cannot cause a functional issue _in the current code_, as pre_sev_run() also checks which pCPU last did VMRUN for the vCPU, and last_vmentry_cpu is initialized to -1 during vCPU creation, i.e. is guaranteed to mismatch on the first VMRUN. However, prior to commit8a14fe4f0c
("kvm: x86: Move last_cpu into kvm_vcpu_arch as last_vmentry_cpu"), SVM tracked pCPU on its own and zero-initialized the last_cpu variable. Thus it's theoretically possible that older versions of KVM could miss a TLB flush if the first VMRUN is on pCPU0 and the ASID and VMCB exactly match those of a prior VM. Fixes:70cd94e60c
("KVM: SVM: VMRUN should use associated ASID when SEV is enabled") Cc: Tom Lendacky <thomas.lendacky@amd.com> Cc: Brijesh Singh <brijesh.singh@amd.com> Cc: stable@vger.kernel.org Signed-off-by: Sean Christopherson <seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Родитель
85cd39af14
Коммит
179c6c27bf
|
@ -189,7 +189,7 @@ static void sev_asid_free(struct kvm_sev_info *sev)
|
||||||
|
|
||||||
for_each_possible_cpu(cpu) {
|
for_each_possible_cpu(cpu) {
|
||||||
sd = per_cpu(svm_data, cpu);
|
sd = per_cpu(svm_data, cpu);
|
||||||
sd->sev_vmcbs[pos] = NULL;
|
sd->sev_vmcbs[sev->asid] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&sev_bitmap_lock);
|
mutex_unlock(&sev_bitmap_lock);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче