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

Commit 905fa4b9 authored by Hollis Blanchard's avatar Hollis Blanchard Committed by Avi Kivity
Browse files

KVM: ppc: Use a read lock around MMU operations, and release it on error



gfn_to_page() and kvm_release_page_clean() are called from other contexts with
mmap_sem locked only for reading.

Signed-off-by: default avatarHollis Blanchard <hollisb@us.ibm.com>
Signed-off-by: default avatarAvi Kivity <avi@qumranet.com>
parent 52435b7c
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -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;