return false;
 }
 
+/*
+ * Like pmd_huge() and pmd_large(), but works regardless of config options
+ */
+#define pmd_is_leaf pmd_is_leaf
+static inline bool pmd_is_leaf(pmd_t pmd)
+{
+       return !!(pmd_raw(pmd) & cpu_to_be64(_PAGE_PTE));
+}
+
+#define pud_is_leaf pud_is_leaf
+static inline bool pud_is_leaf(pud_t pud)
+{
+       return !!(pud_raw(pud) & cpu_to_be64(_PAGE_PTE));
+}
+
+#define pgd_is_leaf pgd_is_leaf
+static inline bool pgd_is_leaf(pgd_t pgd)
+{
+       return !!(pgd_raw(pgd) & cpu_to_be64(_PAGE_PTE));
+}
+
 #endif /* __ASSEMBLY__ */
 #endif /* _ASM_POWERPC_BOOK3S_64_PGTABLE_H_ */
 
 }
 #endif
 
+#ifndef pmd_is_leaf
+#define pmd_is_leaf pmd_is_leaf
+static inline bool pmd_is_leaf(pmd_t pmd)
+{
+       return false;
+}
+#endif
+
+#ifndef pud_is_leaf
+#define pud_is_leaf pud_is_leaf
+static inline bool pud_is_leaf(pud_t pud)
+{
+       return false;
+}
+#endif
+
+#ifndef pgd_is_leaf
+#define pgd_is_leaf pgd_is_leaf
+static inline bool pgd_is_leaf(pgd_t pgd)
+{
+       return false;
+}
+#endif
+
 #endif /* __ASSEMBLY__ */
 
 #endif /* _ASM_POWERPC_PGTABLE_H */
 
 static inline pte_t *find_linux_pte(pgd_t *pgdir, unsigned long ea,
                                    bool *is_thp, unsigned *hshift)
 {
+       pte_t *pte;
+
        VM_WARN(!arch_irqs_disabled(), "%s called with irq enabled\n", __func__);
-       return __find_linux_pte(pgdir, ea, is_thp, hshift);
+       pte = __find_linux_pte(pgdir, ea, is_thp, hshift);
+
+#if defined(CONFIG_DEBUG_VM) &&                                                \
+       !(defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE))
+       /*
+        * We should not find huge page if these configs are not enabled.
+        */
+       if (hshift)
+               WARN_ON(*hshift);
+#endif
+       return pte;
 }
 
 static inline pte_t *find_init_mm_pte(unsigned long ea, unsigned *hshift)
 static inline pte_t *find_current_mm_pte(pgd_t *pgdir, unsigned long ea,
                                         bool *is_thp, unsigned *hshift)
 {
+       pte_t *pte;
+
        VM_WARN(!arch_irqs_disabled(), "%s called with irq enabled\n", __func__);
        VM_WARN(pgdir != current->mm->pgd,
                "%s lock less page table lookup called on wrong mm\n", __func__);
-       return __find_linux_pte(pgdir, ea, is_thp, hshift);
+       pte = __find_linux_pte(pgdir, ea, is_thp, hshift);
+
+#if defined(CONFIG_DEBUG_VM) &&                                                \
+       !(defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE))
+       /*
+        * We should not find huge page if these configs are not enabled.
+        */
+       if (hshift)
+               WARN_ON(*hshift);
+#endif
+       return pte;
 }
 
 #endif /* _ASM_POWERPC_PTE_WALK_H */
 
        kmem_cache_free(kvm_pte_cache, ptep);
 }
 
-/* Like pmd_huge() and pmd_large(), but works regardless of config options */
-static inline int pmd_is_leaf(pmd_t pmd)
-{
-       return !!(pmd_val(pmd) & _PAGE_PTE);
-}
-
 static pmd_t *kvmppc_pmd_alloc(void)
 {
        return kmem_cache_alloc(kvm_pmd_cache, GFP_KERNEL);
        for (iu = 0; iu < PTRS_PER_PUD; ++iu, ++p) {
                if (!pud_present(*p))
                        continue;
-               if (pud_huge(*p)) {
+               if (pud_is_leaf(*p)) {
                        pud_clear(p);
                } else {
                        pmd_t *pmd;
                new_pud = pud_alloc_one(kvm->mm, gpa);
 
        pmd = NULL;
-       if (pud && pud_present(*pud) && !pud_huge(*pud))
+       if (pud && pud_present(*pud) && !pud_is_leaf(*pud))
                pmd = pmd_offset(pud, gpa);
        else if (level <= 1)
                new_pmd = kvmppc_pmd_alloc();
                new_pud = NULL;
        }
        pud = pud_offset(pgd, gpa);
-       if (pud_huge(*pud)) {
+       if (pud_is_leaf(*pud)) {
                unsigned long hgpa = gpa & PUD_MASK;
 
                /* Check if we raced and someone else has set the same thing */
 
                pudp = pud_alloc(&init_mm, pgdp, idx);
                if (!pudp)
                        continue;
-               if (pud_huge(*pudp)) {
+               if (pud_is_leaf(*pudp)) {
                        ptep = (pte_t *)pudp;
                        goto update_the_pte;
                }
                pmdp = pmd_alloc(&init_mm, pudp, idx);
                if (!pmdp)
                        continue;
-               if (pmd_huge(*pmdp)) {
+               if (pmd_is_leaf(*pmdp)) {
                        ptep = pmdp_ptep(pmdp);
                        goto update_the_pte;
                }
                if (!pmd_present(*pmd))
                        continue;
 
-               if (pmd_huge(*pmd)) {
+               if (pmd_is_leaf(*pmd)) {
                        split_kernel_mapping(addr, end, PMD_SIZE, (pte_t *)pmd);
                        continue;
                }
                if (!pud_present(*pud))
                        continue;
 
-               if (pud_huge(*pud)) {
+               if (pud_is_leaf(*pud)) {
                        split_kernel_mapping(addr, end, PUD_SIZE, (pte_t *)pud);
                        continue;
                }
                if (!pgd_present(*pgd))
                        continue;
 
-               if (pgd_huge(*pgd)) {
+               if (pgd_is_leaf(*pgd)) {
                        split_kernel_mapping(addr, end, PGDIR_SIZE, (pte_t *)pgd);
                        continue;
                }
 
        if (pgd_none(pgd))
                return NULL;
 
-       if (pgd_huge(pgd)) {
+       if (pgd_is_leaf(pgd)) {
                ret_pte = (pte_t *)pgdp;
                goto out;
        }
+
        if (is_hugepd(__hugepd(pgd_val(pgd)))) {
                hpdp = (hugepd_t *)&pgd;
                goto out_huge;
        if (pud_none(pud))
                return NULL;
 
-       if (pud_huge(pud)) {
+       if (pud_is_leaf(pud)) {
                ret_pte = (pte_t *)pudp;
                goto out;
        }
+
        if (is_hugepd(__hugepd(pud_val(pud)))) {
                hpdp = (hugepd_t *)&pud;
                goto out_huge;
        }
+
        pdshift = PMD_SHIFT;
        pmdp = pmd_offset(&pud, ea);
        pmd  = READ_ONCE(*pmdp);
                ret_pte = (pte_t *)pmdp;
                goto out;
        }
-       /*
-        * pmd_large check below will handle the swap pmd pte
-        * we need to do both the check because they are config
-        * dependent.
-        */
-       if (pmd_huge(pmd) || pmd_large(pmd)) {
+
+       if (pmd_is_leaf(pmd)) {
                ret_pte = (pte_t *)pmdp;
                goto out;
        }
+
        if (is_hugepd(__hugepd(pmd_val(pmd)))) {
                hpdp = (hugepd_t *)&pmd;
                goto out_huge;
 
 /* 4 level page table */
 struct page *pgd_page(pgd_t pgd)
 {
-       if (pgd_huge(pgd))
+       if (pgd_is_leaf(pgd)) {
+               VM_WARN_ON(!pgd_huge(pgd));
                return pte_page(pgd_pte(pgd));
+       }
        return virt_to_page(pgd_page_vaddr(pgd));
 }
 #endif
 
 struct page *pud_page(pud_t pud)
 {
-       if (pud_huge(pud))
+       if (pud_is_leaf(pud)) {
+               VM_WARN_ON(!pud_huge(pud));
                return pte_page(pud_pte(pud));
+       }
        return virt_to_page(pud_page_vaddr(pud));
 }
 
  */
 struct page *pmd_page(pmd_t pmd)
 {
-       if (pmd_large(pmd) || pmd_huge(pmd) || pmd_devmap(pmd))
+       if (pmd_is_leaf(pmd)) {
+               VM_WARN_ON(!(pmd_large(pmd) || pmd_huge(pmd) || pmd_devmap(pmd)));
                return pte_page(pmd_pte(pmd));
+       }
        return virt_to_page(pmd_page_vaddr(pmd));
 }
 
 
 
        for (i = 0; i < PTRS_PER_PMD; i++, pmd++) {
                addr = start + i * PMD_SIZE;
-               if (!pmd_none(*pmd) && !pmd_huge(*pmd))
+               if (!pmd_none(*pmd) && !pmd_is_leaf(*pmd))
                        /* pmd exists */
                        walk_pte(st, pmd, addr);
                else
 
        for (i = 0; i < PTRS_PER_PUD; i++, pud++) {
                addr = start + i * PUD_SIZE;
-               if (!pud_none(*pud) && !pud_huge(*pud))
+               if (!pud_none(*pud) && !pud_is_leaf(*pud))
                        /* pud exists */
                        walk_pmd(st, pud, addr);
                else
         * the hash pagetable.
         */
        for (i = 0; i < PTRS_PER_PGD; i++, pgd++, addr += PGDIR_SIZE) {
-               if (!pgd_none(*pgd) && !pgd_huge(*pgd))
+               if (!pgd_none(*pgd) && !pgd_is_leaf(*pgd))
                        /* pgd exists */
                        walk_pud(st, pgd, addr);
                else
 
 
        printf("pgd  @ 0x%px\n", pgdir);
 
-       if (pgd_huge(*pgdp)) {
+       if (pgd_is_leaf(*pgdp)) {
                format_pte(pgdp, pgd_val(*pgdp));
                return;
        }
                return;
        }
 
-       if (pud_huge(*pudp)) {
+       if (pud_is_leaf(*pudp)) {
                format_pte(pudp, pud_val(*pudp));
                return;
        }
                return;
        }
 
-       if (pmd_huge(*pmdp)) {
+       if (pmd_is_leaf(*pmdp)) {
                format_pte(pmdp, pmd_val(*pmdp));
                return;
        }