Re: [RFC PATCH] kvm: Use huge pages for DAX-backed files

From: Paolo Bonzini
Date: Tue Nov 06 2018 - 16:16:41 EST


On 06/11/2018 22:05, Barret Rhoden wrote:
> On 2018-10-29 at 17:07 Barret Rhoden <brho@xxxxxxxxxx> wrote:
>> Another issue is that kvm_mmu_zap_collapsible_spte() also uses
>> PageTransCompoundMap() to detect huge pages, but we don't have a way to
>> get the HVA easily. Can we just aggressively zap DAX pages there?
>
> Any thoughts about this? Is there a way to determine the HVA or GFN in
> this function:

Yes, iter.gfn is the gfn inside the loop and iter.level is the level
(1=PTE, 2=PDE, ...). iter.level of course is unusable here, similar to
*levelp in transparent_hugepage_adjust, but you can use iter.gfn and
gfn_to_hva.

Paolo

> static bool kvm_mmu_zap_collapsible_spte(struct kvm *kvm,
> struct kvm_rmap_head *rmap_head)
> {
> u64 *sptep;
> struct rmap_iterator iter;
> int need_tlb_flush = 0;
> kvm_pfn_t pfn;
> struct kvm_mmu_page *sp;
>
> restart:
> for_each_rmap_spte(rmap_head, &iter, sptep) {
> sp = page_header(__pa(sptep));
> pfn = spte_to_pfn(*sptep);
>
> /*
> * We cannot do huge page mapping for indirect shadow pages,
> * which are found on the last rmap (level = 1) when not using
> * tdp; such shadow pages are synced with the page table in
> * the guest, and the guest page table is using 4K page size
> * mapping if the indirect sp has level = 1.
> */
> if (sp->role.direct &&
> !kvm_is_reserved_pfn(pfn) &&
> PageTransCompoundMap(pfn_to_page(pfn))) {
> pte_list_remove(rmap_head, sptep);
> need_tlb_flush = 1;
> goto restart;
> }
> }
>
> return need_tlb_flush;
> }
>
> If not, I was thinking of changing that loop to always remove PTEs for
> DAX mappings, with the understanding that they'll get faulted back in
> later. Ideally, we'd like to check if the page is huge, but DAX can't
> use the PageTransCompoundMap check.
>
> Thanks,
>
> Barret
>
>
>