]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
ARM: pgtable: use pXd_none_or_clear_bad() in pgd_free()
authorRussell King <rmk+kernel@arm.linux.org.uk>
Sun, 21 Nov 2010 23:48:55 +0000 (23:48 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Fri, 26 Nov 2010 20:45:46 +0000 (20:45 +0000)
Remove knowledge of the 2-level wrapping in pgd_free(), and use the
pXd_none_or_clear_bad() macros when checking the entries.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mm/pgd.c

index e3eda56f4788fafbb92dd353ac3f29221be0fce4..d15785eb73a70194527576d74195f35a58137758 100644 (file)
@@ -73,28 +73,29 @@ no_pgd:
        return NULL;
 }
 
-void pgd_free(struct mm_struct *mm, pgd_t *pgd)
+void pgd_free(struct mm_struct *mm, pgd_t *pgd_base)
 {
+       pgd_t *pgd;
        pmd_t *pmd;
        pgtable_t pte;
 
-       if (!pgd)
+       if (!pgd_base)
                return;
 
-       /* pgd is always present and good */
-       pmd = pmd_off(pgd, 0);
-       if (pmd_none(*pmd))
-               goto free;
-       if (pmd_bad(*pmd)) {
-               pmd_ERROR(*pmd);
-               pmd_clear(pmd);
-               goto free;
-       }
+       pgd = pgd_base + pgd_index(0);
+       if (pgd_none_or_clear_bad(pgd))
+               goto no_pgd;
+
+       pmd = pmd_offset(pgd, 0);
+       if (pmd_none_or_clear_bad(pmd))
+               goto no_pmd;
 
        pte = pmd_pgtable(*pmd);
        pmd_clear(pmd);
        pte_free(mm, pte);
+no_pmd:
+       pgd_clear(pgd);
        pmd_free(mm, pmd);
-free:
-       free_pages((unsigned long) pgd, 2);
+no_pgd:
+       free_pages((unsigned long) pgd_base, 2);
 }