svm: Add mutex_lock to protect apic_access_page_done on AMD systems
There is a race condition when accessing kvm->arch.apic_access_page_done. Due to it, x86_set_memory_region will fail when creating the second vcpu for a svm guest. Add a mutex_lock to serialize the accesses to apic_access_page_done. This lock is also used by vmx for the same purpose. Signed-off-by: Wei Wang <wawei@amazon.de> Signed-off-by: Amadeusz Juskowiak <ajusk@amazon.de> Signed-off-by: Julian Stecklina <jsteckli@amazon.de> Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com> Reviewed-by: Joerg Roedel <jroedel@suse.de> Cc: stable@vger.kernel.org Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>hifive-unleashed-5.1
parent
e97f852fd4
commit
30510387a5
|
@ -1664,20 +1664,23 @@ static u64 *avic_get_physical_id_entry(struct kvm_vcpu *vcpu,
|
||||||
static int avic_init_access_page(struct kvm_vcpu *vcpu)
|
static int avic_init_access_page(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
struct kvm *kvm = vcpu->kvm;
|
struct kvm *kvm = vcpu->kvm;
|
||||||
int ret;
|
int ret = 0;
|
||||||
|
|
||||||
|
mutex_lock(&kvm->slots_lock);
|
||||||
if (kvm->arch.apic_access_page_done)
|
if (kvm->arch.apic_access_page_done)
|
||||||
return 0;
|
goto out;
|
||||||
|
|
||||||
ret = x86_set_memory_region(kvm,
|
ret = __x86_set_memory_region(kvm,
|
||||||
APIC_ACCESS_PAGE_PRIVATE_MEMSLOT,
|
APIC_ACCESS_PAGE_PRIVATE_MEMSLOT,
|
||||||
APIC_DEFAULT_PHYS_BASE,
|
APIC_DEFAULT_PHYS_BASE,
|
||||||
PAGE_SIZE);
|
PAGE_SIZE);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
goto out;
|
||||||
|
|
||||||
kvm->arch.apic_access_page_done = true;
|
kvm->arch.apic_access_page_done = true;
|
||||||
return 0;
|
out:
|
||||||
|
mutex_unlock(&kvm->slots_lock);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int avic_init_backing_page(struct kvm_vcpu *vcpu)
|
static int avic_init_backing_page(struct kvm_vcpu *vcpu)
|
||||||
|
|
Loading…
Reference in New Issue