On 22/06/2015 15:28, Hu Yaohui wrote:
>
> */2504 pseudo_gfn = base_addr >> PAGE_SHIFT;
> 2505 sp = kvm_mmu_get_page(vcpu, pseudo_gfn, iterator.addr,
> 2506 iterator.level - 1,
> 2507 1, ACC_ALL, iterator.sptep);/*
> 2508 if (!sp) {
> 2509 pgprintk("nonpaging_map: ENOMEM\n");
> 2510 kvm_release_pfn_clean(pfn);
> 2511 return -ENOMEM;
> 2512 }
> .........
>
> </code>
> it will get a pseudo_gfn to allocate a kvm_mmu_page. What if a
> pseudo_gfn itself causes a tdp_page_fault?
> Will it make the corresponding EPT page table entry marked as readonly also?
If tdp_page_fault is used (meaning non-nested KVM: nested KVM uses
ept_page_fault instead), sp->unsync is always true:
/* in kvm_mmu_get_page - __direct_map passes direct == true */
if (!direct) {
if (rmap_write_protect(vcpu, gfn))
kvm_flush_remote_tlbs(vcpu->kvm);
if (level > PT_PAGE_TABLE_LEVEL && need_sync)
kvm_sync_pages(vcpu, gfn);
account_shadowed(vcpu->kvm, sp);
}
so mmu_need_write_protect always returns false.
Note that higher in kvm_mmu_get_page there is another conditional:
if (!need_sync && sp->unsync)
need_sync = true;
but it only applies to the !direct case.
Paolo
--
To unsubscribe from this list: send the line "unsubscribe kvm" in