Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6e4beb5e authored by Russell King's avatar Russell King
Browse files

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: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent b0d03745
Loading
Loading
Loading
Loading
+14 −13
Original line number Diff line number Diff line
@@ -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);
}