> -----Original Message-----
> From: kvm-ow...@vger.kernel.org [mailto:kvm-ow...@vger.kernel.org] On
> Behalf Of Christoffer Dall
> Sent: Monday, October 01, 2012 6:11 PM
> To: kvm@vger.kernel.org; linux-arm-ker...@lists.infradead.org;
> kvm...@lists.cs.columbia.edu
> Cc: Marc Zyngier
> Subject: [PATCH v2 06/14] KVM: ARM: Memory virtualization setup
> 
> +static void stage2_set_pte(struct kvm *kvm, struct kvm_mmu_memory_cache
> *cache,
> +                        phys_addr_t addr, const pte_t *new_pte) {
> +     pgd_t *pgd;
> +     pud_t *pud;
> +     pmd_t *pmd;
> +     pte_t *pte, old_pte;
> +
> +     /* Create 2nd stage page table mapping - Level 1 */
> +     pgd = kvm->arch.pgd + pgd_index(addr);
> +     pud = pud_offset(pgd, addr);
> +     if (pud_none(*pud)) {
> +             if (!cache)
> +                     return; /* ignore calls from kvm_set_spte_hva */
> +             pmd = mmu_memory_cache_alloc(cache);
> +             pud_populate(NULL, pud, pmd);
> +             pmd += pmd_index(addr);
> +             get_page(virt_to_page(pud));
> +     } else
> +             pmd = pmd_offset(pud, addr);
> +
> +     /* Create 2nd stage page table mapping - Level 2 */
> +     if (pmd_none(*pmd)) {
> +             if (!cache)
> +                     return; /* ignore calls from kvm_set_spte_hva */
> +             pte = mmu_memory_cache_alloc(cache);
> +             clean_pte_table(pte);
> +             pmd_populate_kernel(NULL, pmd, pte);
> +             pte += pte_index(addr);
> +             get_page(virt_to_page(pmd));
> +     } else
> +             pte = pte_offset_kernel(pmd, addr);
> +
> +     /* Create 2nd stage page table mapping - Level 3 */
> +     old_pte = *pte;
> +     set_pte_ext(pte, *new_pte, 0);
> +     if (pte_present(old_pte))
> +             __kvm_tlb_flush_vmid(kvm);
> +     else
> +             get_page(virt_to_page(pte));
> +}


I'm not sure about the 3-level page table, but isn't it necessary to
clean the page table for 2nd level?
There are two mmu_memory_cache_alloc calls. One has following clean_pte_table
and the other doesn't have. 

And why do you ignore calls from kvm_set_spte_hva? It is supposed to happen when
host moves the page, right? Then you ignore the case because it can be handled
later when fault actually happens? Is there any other reason that I miss?

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to