KVM: ARM: Remove pgtable page standard functions from stage-2 page tables
authorAnshuman Khandual <anshuman.khandual@arm.com>
Tue, 12 Mar 2019 13:25:45 +0000 (18:55 +0530)
committerWill Deacon <will.deacon@arm.com>
Tue, 9 Apr 2019 10:21:50 +0000 (11:21 +0100)
ARM64 standard pgtable functions are going to use pgtable_page_[ctor|dtor]
or pgtable_pmd_page_[ctor|dtor] constructs. At present KVM guest stage-2
PUD|PMD|PTE level page tabe pages are allocated with __get_free_page()
via mmu_memory_cache_alloc() but released with standard pud|pmd_free() or
pte_free_kernel(). These will fail once they start calling into pgtable_
[pmd]_page_dtor() for pages which never originally went through respective
constructor functions. Hence convert all stage-2 page table page release
functions to call buddy directly while freeing pages.

Reviewed-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Acked-by: Yu Zhao <yuzhao@google.com>
Acked-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm/include/asm/stage2_pgtable.h
arch/arm64/include/asm/stage2_pgtable.h
virt/kvm/arm/mmu.c

index 9e11dce55e06f4e7359b7b779cc7814ae752c813..9587517649bd7123a4a1fa8caba11871d56e0849 100644 (file)
 #define stage2_pgd_present(kvm, pgd)           pgd_present(pgd)
 #define stage2_pgd_populate(kvm, pgd, pud)     pgd_populate(NULL, pgd, pud)
 #define stage2_pud_offset(kvm, pgd, address)   pud_offset(pgd, address)
-#define stage2_pud_free(kvm, pud)              pud_free(NULL, pud)
+#define stage2_pud_free(kvm, pud)              do { } while (0)
 
 #define stage2_pud_none(kvm, pud)              pud_none(pud)
 #define stage2_pud_clear(kvm, pud)             pud_clear(pud)
 #define stage2_pud_present(kvm, pud)           pud_present(pud)
 #define stage2_pud_populate(kvm, pud, pmd)     pud_populate(NULL, pud, pmd)
 #define stage2_pmd_offset(kvm, pud, address)   pmd_offset(pud, address)
-#define stage2_pmd_free(kvm, pmd)              pmd_free(NULL, pmd)
+#define stage2_pmd_free(kvm, pmd)              free_page((unsigned long)pmd)
 
 #define stage2_pud_huge(kvm, pud)              pud_huge(pud)
 
index 5412fa40825e83d892b19d379083d3b8cf479bb7..915809e4ac32d4339452ea9c8be76a6499ecc2ca 100644 (file)
@@ -119,7 +119,7 @@ static inline pud_t *stage2_pud_offset(struct kvm *kvm,
 static inline void stage2_pud_free(struct kvm *kvm, pud_t *pud)
 {
        if (kvm_stage2_has_pud(kvm))
-               pud_free(NULL, pud);
+               free_page((unsigned long)pud);
 }
 
 static inline bool stage2_pud_table_empty(struct kvm *kvm, pud_t *pudp)
@@ -192,7 +192,7 @@ static inline pmd_t *stage2_pmd_offset(struct kvm *kvm,
 static inline void stage2_pmd_free(struct kvm *kvm, pmd_t *pmd)
 {
        if (kvm_stage2_has_pmd(kvm))
-               pmd_free(NULL, pmd);
+               free_page((unsigned long)pmd);
 }
 
 static inline bool stage2_pud_huge(struct kvm *kvm, pud_t pud)
index 27c958306449f7533c6cfa4aa878ca8d4c995e48..ad90ea3e5558a0911bf7602d67c2a16e6a7305f8 100644 (file)
@@ -189,7 +189,7 @@ static void clear_stage2_pmd_entry(struct kvm *kvm, pmd_t *pmd, phys_addr_t addr
        VM_BUG_ON(pmd_thp_or_huge(*pmd));
        pmd_clear(pmd);
        kvm_tlb_flush_vmid_ipa(kvm, addr);
-       pte_free_kernel(NULL, pte_table);
+       free_page((unsigned long)pte_table);
        put_page(virt_to_page(pmd));
 }