]> err.no Git - linux-2.6/blobdiff - arch/i386/mm/hugetlbpage.c
[PATCH] hugetlb: move stale pte check into huge_pte_alloc()
[linux-2.6] / arch / i386 / mm / hugetlbpage.c
index 3b099f32b9487a054db420509ad25591ea0d06eb..57c486f0e896c71056fcd139a6b3e1faec925ba0 100644 (file)
@@ -22,12 +22,21 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
 {
        pgd_t *pgd;
        pud_t *pud;
-       pmd_t *pmd = NULL;
+       pmd_t *pmd;
+       pte_t *pte = NULL;
 
        pgd = pgd_offset(mm, addr);
        pud = pud_alloc(mm, pgd, addr);
        pmd = pmd_alloc(mm, pud, addr);
-       return (pte_t *) pmd;
+
+       if (!pmd)
+               goto out;
+
+       pte = (pte_t *) pmd;
+       if (!pte_none(*pte) && !pte_huge(*pte))
+               hugetlb_clean_stale_pgtable(pte);
+out:
+       return pte;
 }
 
 pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)