> @@ -1219,53 +1229,75 @@ static void nonpaging_prefetch_page(struct kvm_vcpu > *vcpu, > > static void mmu_free_roots(struct kvm_vcpu *vcpu) > { > - int i; > + int i, j; > struct kvm_mmu_page *sp; > > - if (!VALID_PAGE(vcpu->arch.mmu.root_hpa)) > - return; > + /* > + * Skip to the next cr3 filter entry and free it (if it's occupied). > + */ > + vcpu->arch.cr3_cache_idx++; > + if (unlikely(vcpu->arch.cr3_cache_idx >= vcpu->arch.cr3_cache_limit)) > + vcpu->arch.cr3_cache_idx = 0; > + > + j = vcpu->arch.cr3_cache_idx; > + /* > + * Clear the guest-visible entry. > + */ > + if (vcpu->arch.cr3_cache) { > + vcpu->arch.cr3_cache->entry[j].guest_cr3 = 0; > + vcpu->arch.cr3_cache->entry[j].host_cr3 = 0; > + } Here CR3_TARGET_VALUEx is not written. ...... > @@ -1322,10 +1353,23 @@ static void vmx_set_cr0(struct kvm_vcpu *vcpu, > unsigned long cr0) > > static void vmx_set_cr3(struct kvm_vcpu *vcpu, unsigned long cr3) > { > + struct kvm_cr3_cache *cache; > + int idx; > + > vmx_flush_tlb(vcpu); > vmcs_writel(GUEST_CR3, cr3); > if (vcpu->arch.cr0 & X86_CR0_PE) > vmx_fpu_deactivate(vcpu); > + > + if (!vcpu->arch.cr3_cache) > + return; > + > + idx = vcpu->arch.cr3_cache_idx; > + cache = vcpu->arch.cr3_cache; > + > + cache->entry[idx].host_cr3 = cr3; > + cache->entry[idx].guest_cr3 = vcpu->arch.cr3; > + vmcs_writel(CR3_TARGET_VALUE0 + idx*2, cr3); > } > Here CR3_TARGET_VALUEx is written. My question is: 1 why is vmcs_writel(CR3_TARGET_VALUE0 + idx*2, cr3); called by vmx_set_cr3(), but not called by mmu_free_roots()? 2 since "cache" is also mapped to guest OS. Is calling vmcs_writel(CR3_TARGET_VALUE0 + idx*2, cr3); necessary?
Thanks, Forrest ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel