}
 
 extern void hpte_do_hugepage_flush(struct mm_struct *mm, unsigned long addr,
-                                  pmd_t *pmdp);
+                                  pmd_t *pmdp, unsigned long old_pmd);
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
 extern pmd_t pfn_pmd(unsigned long pfn, pgprot_t pgprot);
 extern pmd_t mk_pmd(struct page *page, pgprot_t pgprot);
 
        *pmdp = __pmd((old & ~clr) | set);
 #endif
        if (old & _PAGE_HASHPTE)
-               hpte_do_hugepage_flush(mm, addr, pmdp);
+               hpte_do_hugepage_flush(mm, addr, pmdp, old);
        return old;
 }
 
        if (!(old & _PAGE_SPLITTING)) {
                /* We need to flush the hpte */
                if (old & _PAGE_HASHPTE)
-                       hpte_do_hugepage_flush(vma->vm_mm, address, pmdp);
+                       hpte_do_hugepage_flush(vma->vm_mm, address, pmdp, old);
        }
        /*
         * This ensures that generic code that rely on IRQ disabling
  * neesd to be flushed.
  */
 void hpte_do_hugepage_flush(struct mm_struct *mm, unsigned long addr,
-                           pmd_t *pmdp)
+                           pmd_t *pmdp, unsigned long old_pmd)
 {
        int ssize, i;
        unsigned long s_addr;
                return;
 
        /* get the base page size,vsid and segment size */
+#ifdef CONFIG_DEBUG_VM
        psize = get_slice_psize(mm, s_addr);
+       BUG_ON(psize == MMU_PAGE_16M);
+#endif
+       if (old_pmd & _PAGE_COMBO)
+               psize = MMU_PAGE_4K;
+       else
+               psize = MMU_PAGE_64K;
+
        if (!is_kernel_addr(s_addr)) {
                ssize = user_segment_size(s_addr);
                vsid = get_vsid(mm->context.id, s_addr, ssize);
 
                if (!(pte & _PAGE_HASHPTE))
                        continue;
                if (unlikely(hugepage_shift && pmd_trans_huge(*(pmd_t *)pte)))
-                       hpte_do_hugepage_flush(mm, start, (pmd_t *)pte);
+                       hpte_do_hugepage_flush(mm, start, (pmd_t *)ptep, pte);
                else
                        hpte_need_flush(mm, start, ptep, pte, 0);
        }