mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-31 08:04:55 +00:00
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: Hollis Blanchard <hollisb@us.ibm.com> Signed-off-by: Avi Kivity <avi@qumranet.com>
This commit is contained in:
parent
52435b7c7a
commit
905fa4b9d6
@ -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];
|
stlbe = &vcpu->arch.shadow_tlb[victim];
|
||||||
|
|
||||||
/* Get reference to new page. */
|
/* Get reference to new page. */
|
||||||
down_write(¤t->mm->mmap_sem);
|
down_read(¤t->mm->mmap_sem);
|
||||||
new_page = gfn_to_page(vcpu->kvm, gfn);
|
new_page = gfn_to_page(vcpu->kvm, gfn);
|
||||||
if (is_error_page(new_page)) {
|
if (is_error_page(new_page)) {
|
||||||
printk(KERN_ERR "Couldn't get guest page!\n");
|
printk(KERN_ERR "Couldn't get guest page!\n");
|
||||||
kvm_release_page_clean(new_page);
|
kvm_release_page_clean(new_page);
|
||||||
|
up_read(¤t->mm->mmap_sem);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
hpaddr = page_to_phys(new_page);
|
hpaddr = page_to_phys(new_page);
|
||||||
|
|
||||||
/* Drop reference to old page. */
|
/* Drop reference to old page. */
|
||||||
kvmppc_44x_shadow_release(vcpu, victim);
|
kvmppc_44x_shadow_release(vcpu, victim);
|
||||||
up_write(¤t->mm->mmap_sem);
|
up_read(¤t->mm->mmap_sem);
|
||||||
|
|
||||||
vcpu->arch.shadow_pages[victim] = new_page;
|
vcpu->arch.shadow_pages[victim] = new_page;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user