]> err.no Git - linux-2.6/commitdiff
KVM: ppc: Use a read lock around MMU operations, and release it on error
authorHollis Blanchard <hollisb@us.ibm.com>
Wed, 21 May 2008 23:22:54 +0000 (18:22 -0500)
committerAvi Kivity <avi@qumranet.com>
Fri, 6 Jun 2008 18:22:33 +0000 (21:22 +0300)
gfn_to_page() and kvm_release_page_clean() are called from other contexts with
mmap_sem locked only for reading.

Signed-off-by: Hollis Blanchard <hollisb@us.ibm.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
arch/powerpc/kvm/44x_tlb.c

index aa649c7db99b70417150510c51ea0cfa88e017f4..1c48d6164bd5b451aa83a8752cf826ef677d1486 100644 (file)
@@ -142,18 +142,19 @@ void kvmppc_mmu_map(struct kvm_vcpu *vcpu, u64 gvaddr, gfn_t gfn, u64 asid,
        stlbe = &vcpu->arch.shadow_tlb[victim];
 
        /* Get reference to new page. */
-       down_write(&current->mm->mmap_sem);
+       down_read(&current->mm->mmap_sem);
        new_page = gfn_to_page(vcpu->kvm, gfn);
        if (is_error_page(new_page)) {
                printk(KERN_ERR "Couldn't get guest page!\n");
                kvm_release_page_clean(new_page);
+               up_read(&current->mm->mmap_sem);
                return;
        }
        hpaddr = page_to_phys(new_page);
 
        /* Drop reference to old page. */
        kvmppc_44x_shadow_release(vcpu, victim);
-       up_write(&current->mm->mmap_sem);
+       up_read(&current->mm->mmap_sem);
 
        vcpu->arch.shadow_pages[victim] = new_page;