Skip to content

Commit

Permalink
ARM: pgtable: use pXd_none_or_clear_bad() in pgd_free()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Russell King committed Nov 26, 2010
1 parent b0d0374 commit 6e4beb5
Showing 1 changed file with 14 additions and 13 deletions.
27 changes: 14 additions & 13 deletions arch/arm/mm/pgd.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,28 +73,29 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
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);
}

0 comments on commit 6e4beb5

Please sign in to comment.