diff options
| author | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-11-21 18:48:55 -0500 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-11-26 15:45:46 -0500 |
| commit | 6e4beb5e682953212da48ebb9e5c90408b8d38ae (patch) | |
| tree | 7db9b9ce44dee035c738c5b292235447987bc099 | |
| parent | b0d03745b18c39b8e86e70f7778f2093d2cd4ed7 (diff) | |
ARM: pgtable: use pXd_none_or_clear_bad() in pgd_free()
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>
| -rw-r--r-- | arch/arm/mm/pgd.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/arch/arm/mm/pgd.c b/arch/arm/mm/pgd.c index e3eda56f4788..d15785eb73a7 100644 --- a/arch/arm/mm/pgd.c +++ b/arch/arm/mm/pgd.c | |||
| @@ -73,28 +73,29 @@ no_pgd: | |||
| 73 | return NULL; | 73 | return NULL; |
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | void pgd_free(struct mm_struct *mm, pgd_t *pgd) | 76 | void pgd_free(struct mm_struct *mm, pgd_t *pgd_base) |
| 77 | { | 77 | { |
| 78 | pgd_t *pgd; | ||
| 78 | pmd_t *pmd; | 79 | pmd_t *pmd; |
| 79 | pgtable_t pte; | 80 | pgtable_t pte; |
| 80 | 81 | ||
| 81 | if (!pgd) | 82 | if (!pgd_base) |
| 82 | return; | 83 | return; |
| 83 | 84 | ||
| 84 | /* pgd is always present and good */ | 85 | pgd = pgd_base + pgd_index(0); |
| 85 | pmd = pmd_off(pgd, 0); | 86 | if (pgd_none_or_clear_bad(pgd)) |
| 86 | if (pmd_none(*pmd)) | 87 | goto no_pgd; |
| 87 | goto free; | 88 | |
| 88 | if (pmd_bad(*pmd)) { | 89 | pmd = pmd_offset(pgd, 0); |
| 89 | pmd_ERROR(*pmd); | 90 | if (pmd_none_or_clear_bad(pmd)) |
| 90 | pmd_clear(pmd); | 91 | goto no_pmd; |
| 91 | goto free; | ||
| 92 | } | ||
| 93 | 92 | ||
| 94 | pte = pmd_pgtable(*pmd); | 93 | pte = pmd_pgtable(*pmd); |
| 95 | pmd_clear(pmd); | 94 | pmd_clear(pmd); |
| 96 | pte_free(mm, pte); | 95 | pte_free(mm, pte); |
| 96 | no_pmd: | ||
| 97 | pgd_clear(pgd); | ||
| 97 | pmd_free(mm, pmd); | 98 | pmd_free(mm, pmd); |
| 98 | free: | 99 | no_pgd: |
| 99 | free_pages((unsigned long) pgd, 2); | 100 | free_pages((unsigned long) pgd_base, 2); |
| 100 | } | 101 | } |
