Re: Calling to kvm_mmu_load

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Paolo,

On Fri, Oct 25, 2013 at 8:43 AM, Paolo Bonzini <pbonzini@xxxxxxxxxx> wrote:
> Il 24/10/2013 08:55, Arthur Chunqi Li ha scritto:
>> Hi Paolo,
>>
>> Thanks for your reply.
>>
>> On Wed, Oct 23, 2013 at 2:21 PM, Paolo Bonzini <pbonzini@xxxxxxxxxx> wrote:
>>> Il 21/10/2013 08:56, Arthur Chunqi Li ha scritto:
>>>> Hi there,
>>>>
>>>> I noticed that kvm_mmu_reload() is called every time in vcpu enter,
>>>> and kvm_mmu_load() is called in this function when root_hpa is
>>>> INVALID_PAGE. I get confused why and when root_hpa can be set to
>>>> INVALID_PAGE? I find one condition that if vcpu get request
>>>> KVM_REQ_MMU_RELOAD, kvm_mmu_unload() is called to invalid root_hpa,
>>>> but this condition cannot cover all occasions.
>>>
>>> Look also at mmu_free_roots, kvm_mmu_unload and kvm_mmu_reset_context.
>>> In "normal" cases and without EPT, it should be called when CR3 changes
>>> or when the paging mode changes (32-bit, PAE, 64-bit, no paging).  With
>>> EPT, this kind of change won't reset the MMU (CR3 changes won't cause a
>>> vmexit at all, in fact).
>>
>> When EPT is enabled, why will root_hpa be set to INVALID_PAGE when a
>> VM boots?
>
> Because EPT page tables are only built lazily.  The EPT page tables
> start all-invalid, and are built as the guest accesses pages at new
> guest physical addresses (instead, shadow page tables are built as the
> guest accesses pages at new guest virtual addresses).
>
>> I find that Qemu reset root_hpa with KVM_REQ_MMU_RELOAD
>> request several time when booting a VM, why?
>
> This happens when the memory map changes.  A previously-valid guest
> physical address might become invalid now, and the EPT page tables have
> to be "emptied".
>
>> And will VM use EPT from the very beginning when booting?
>
> Yes.  But it's not the VM.  It's KVM that uses EPT.
>
> The VM only uses EPT if you're using nested virtualization, and EPT is
> enabled.  L1's KVM uses EPT, L2 doesn't (because it doesn't run KVM).
>
>>> With nested virtualization, roots are invalidated whenever kvm->arch.mmu
>>> changes meaning from L1->L0 or L2->L0 or vice versa (in the special case
>>> where EPT is disabled on L0, this is trivially because vmentry loads CR3
>>> from the vmcs02).
>>
>> Besides, in function tdp_page_fault(), I find two different execution
>> flow which may not reach __direct_map() (which I think is the normal
>> path to handle PF), they are fast_page_fault() and try_async_pf().
>> When will these two paths called when handling EPT page fault?
>
> fast_page_fault() is called if you're using dirty page tracking.  It
> checks if we have a read-only page that is in a writeable memory slot
> (SPTE_HOST_WRITEABLE) and whose PTE allows writes (SPTE_MMU_WRITEABLE).
>  If these conditions are satisfied, the page was read-only because of
> dirty page tracking; it is made read-write with a single cmpxchg and
> sets the bit for the page in the dirty bitmap.

What is the dirty page tracking code path? I find a obsoleted flag
"dirty_page_log_all" in the very previous codes, but I cannot get the
most recent version of tracking dirty pages.

Besides, I noticed that memory management in KVM uses the mechanism
with "struct kvm_memory_slot". How is kvm_memory_slot used with the
cooperation of Linux memory management?

Thanks,
Arthur

>
> try_async_pf will inject a "dummy" pagefault instead of creating the EPT
> page table, and create the page table in the background.  The guest will
> do something else (run another task) until the EPT page table has been
> created; then a second "dummy" pagefault is injected.
> kvm_arch_async_page_not_present signals the first page fault,
> kvm_arch_async_page_present signals the second.  For this to happen, the
> guest must have enabled the asynchronous page fault feature with a write
> to a KVM-specific MSR.
>
> Paolo
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux