KVM: remove the usage of the mmap_sem for the protection of the memory slots.
This patch replaces the mmap_sem lock for the memory slots with a new kvm private lock, it is needed beacuse untill now there were cases where kvm accesses user memory while holding the mmap semaphore. Signed-off-by: Izik Eidus <izike@qumranet.com> Signed-off-by: Avi Kivity <avi@qumranet.com>
This commit is contained in:
@@ -91,7 +91,10 @@ static bool FNAME(cmpxchg_gpte)(struct kvm *kvm,
|
||||
pt_element_t *table;
|
||||
struct page *page;
|
||||
|
||||
down_read(¤t->mm->mmap_sem);
|
||||
page = gfn_to_page(kvm, table_gfn);
|
||||
up_read(¤t->mm->mmap_sem);
|
||||
|
||||
table = kmap_atomic(page, KM_USER0);
|
||||
|
||||
ret = CMPXCHG(&table[index], orig_pte, new_pte);
|
||||
@@ -378,7 +381,7 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr,
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
down_read(¤t->mm->mmap_sem);
|
||||
down_read(&vcpu->kvm->slots_lock);
|
||||
/*
|
||||
* Look up the shadow pte for the faulting address.
|
||||
*/
|
||||
@@ -392,11 +395,13 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr,
|
||||
pgprintk("%s: guest page fault\n", __FUNCTION__);
|
||||
inject_page_fault(vcpu, addr, walker.error_code);
|
||||
vcpu->arch.last_pt_write_count = 0; /* reset fork detector */
|
||||
up_read(¤t->mm->mmap_sem);
|
||||
up_read(&vcpu->kvm->slots_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
down_read(¤t->mm->mmap_sem);
|
||||
page = gfn_to_page(vcpu->kvm, walker.gfn);
|
||||
up_read(¤t->mm->mmap_sem);
|
||||
|
||||
spin_lock(&vcpu->kvm->mmu_lock);
|
||||
kvm_mmu_free_some_pages(vcpu);
|
||||
@@ -413,14 +418,14 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr,
|
||||
*/
|
||||
if (shadow_pte && is_io_pte(*shadow_pte)) {
|
||||
spin_unlock(&vcpu->kvm->mmu_lock);
|
||||
up_read(¤t->mm->mmap_sem);
|
||||
up_read(&vcpu->kvm->slots_lock);
|
||||
return 1;
|
||||
}
|
||||
|
||||
++vcpu->stat.pf_fixed;
|
||||
kvm_mmu_audit(vcpu, "post page fault (fixed)");
|
||||
spin_unlock(&vcpu->kvm->mmu_lock);
|
||||
up_read(¤t->mm->mmap_sem);
|
||||
up_read(&vcpu->kvm->slots_lock);
|
||||
|
||||
return write_pt;
|
||||
}
|
||||
|
Reference in New Issue
Block a user