Commit 28ee90fe authored by Toshi Kani's avatar Toshi Kani Committed by Linus Torvalds
Browse files

x86/mm: implement free pmd/pte page interfaces

Implement pud_free_pmd_page() and pmd_free_pte_page() on x86, which
clear a given pud/pmd entry and free up lower level page table(s).

The address range associated with the pud/pmd entry must have been
purged by INVLPG.

Fixes: e61ce6ad

 ("mm: change ioremap to set up huge I/O mappings")
Signed-off-by: default avatarToshi Kani <>
Reported-by: default avatarLei Li <>
Cc: Michal Hocko <>
Cc: Thomas Gleixner <>
Cc: Ingo Molnar <>
Cc: "H. Peter Anvin" <>
Cc: Borislav Petkov <>
Cc: Matthew Wilcox <>
Cc: <>
Signed-off-by: default avatarAndrew Morton <>
Signed-off-by: default avatarLinus Torvalds <>
parent b6bdb751
......@@ -712,7 +712,22 @@ int pmd_clear_huge(pmd_t *pmd)
int pud_free_pmd_page(pud_t *pud)
return pud_none(*pud);
pmd_t *pmd;
int i;
if (pud_none(*pud))
return 1;
pmd = (pmd_t *)pud_page_vaddr(*pud);
for (i = 0; i < PTRS_PER_PMD; i++)
if (!pmd_free_pte_page(&pmd[i]))
return 0;
free_page((unsigned long)pmd);
return 1;
......@@ -724,6 +739,15 @@ int pud_free_pmd_page(pud_t *pud)
int pmd_free_pte_page(pmd_t *pmd)
return pmd_none(*pmd);
pte_t *pte;
if (pmd_none(*pmd))
return 1;
pte = (pte_t *)pmd_page_vaddr(*pmd);
free_page((unsigned long)pte);
return 1;
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment