KVM: MMU: fix missing locking in alloc_mmu_pages
n_requested_mmu_pages/n_free_mmu_pages are used by kvm_mmu_change_mmu_pages to calculate the number of pages to zap. alloc_mmu_pages, called from the vcpu initialization path, modifies this variables without proper locking, which can result in a negative value in kvm_mmu_change_mmu_pages (say, with cpu hotplug). Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:
parent
3662cb1cd6
commit
6a1ac77110
1 changed files with 2 additions and 0 deletions
|
@ -2728,12 +2728,14 @@ static int alloc_mmu_pages(struct kvm_vcpu *vcpu)
|
|||
|
||||
ASSERT(vcpu);
|
||||
|
||||
spin_lock(&vcpu->kvm->mmu_lock);
|
||||
if (vcpu->kvm->arch.n_requested_mmu_pages)
|
||||
vcpu->kvm->arch.n_free_mmu_pages =
|
||||
vcpu->kvm->arch.n_requested_mmu_pages;
|
||||
else
|
||||
vcpu->kvm->arch.n_free_mmu_pages =
|
||||
vcpu->kvm->arch.n_alloc_mmu_pages;
|
||||
spin_unlock(&vcpu->kvm->mmu_lock);
|
||||
/*
|
||||
* When emulating 32-bit mode, cr3 is only 32 bits even on x86_64.
|
||||
* Therefore we need to allocate shadow page tables in the first
|
||||
|
|
Loading…
Reference in a new issue