Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 85bb1e8b authored by Wei Wang's avatar Wei Wang Committed by Greg Kroah-Hartman
Browse files

svm: Add mutex_lock to protect apic_access_page_done on AMD systems



commit 30510387a5e45bfcf8190e03ec7aa15b295828e2 upstream.

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: default avatarWei Wang <wawei@amazon.de>
Signed-off-by: default avatarAmadeusz Juskowiak <ajusk@amazon.de>
Signed-off-by: default avatarJulian Stecklina <jsteckli@amazon.de>
Signed-off-by: default avatarSuravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Reviewed-by: default avatarJoerg Roedel <jroedel@suse.de>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent e762e140
Loading
Loading
Loading
Loading
+11 −8
Original line number Diff line number Diff line
@@ -1663,20 +1663,23 @@ static u64 *avic_get_physical_id_entry(struct kvm_vcpu *vcpu,
static int avic_init_access_page(struct kvm_vcpu *vcpu)
{
	struct kvm *kvm = vcpu->kvm;
	int ret;
	int ret = 0;

	mutex_lock(&kvm->slots_lock);
	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_DEFAULT_PHYS_BASE,
				      PAGE_SIZE);
	if (ret)
		return ret;
		goto out;

	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)