Re: [PATCH 2/2] x86/mm: implement free pmd/pte page interfaces

2018-03-07 Thread Kani, Toshi
On Wed, 2018-03-07 at 15:01 -0800, Andrew Morton wrote:
> On Wed,  7 Mar 2018 11:32:27 -0700 Toshi Kani  wrote:
> 
> > 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).
> > Address range associated with the pud/pmd entry must have been purged
> > by INVLPG.
> 
> OK, now we have implementations which match the naming ;) Again, is a
> cc:stable warranted?

Right. This patch 2/2 fixes the memory leak on x86.

Fixes: e61ce6ade404e ("mm: change ioremap to set up huge I/O mappings")

Patch 1/2 fixes the panic on arm64.

Fixes: 324420bf91f60 ("arm64: add support for ioremap() block mappings")

> Do you have any preferences/suggestions as to which tree these should
> be merged through?  You're hitting core, arm and x86.

No, I do not have any preference.

Thanks,
-Toshi



Re: [PATCH 2/2] x86/mm: implement free pmd/pte page interfaces

2018-03-07 Thread Andrew Morton
On Wed,  7 Mar 2018 11:32:27 -0700 Toshi Kani  wrote:

> 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).
> Address range associated with the pud/pmd entry must have been purged
> by INVLPG.

OK, now we have implementations which match the naming ;) Again, is a
cc:stable warranted?

Do you have any preferences/suggestions as to which tree these should
be merged through?  You're hitting core, arm and x86.


[PATCH 2/2] x86/mm: implement free pmd/pte page interfaces

2018-03-07 Thread Toshi Kani
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).
Address range associated with the pud/pmd entry must have been purged
by INVLPG.

Signed-off-by: Toshi Kani 
Cc: Michal Hocko 
Cc: Andrew Morton 
Cc: Thomas Gleixner 
Cc: Ingo Molnar 
Cc: "H. Peter Anvin" 
Cc: Borislav Petkov 
---
 arch/x86/mm/pgtable.c |   28 ++--
 1 file changed, 26 insertions(+), 2 deletions(-)

diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c
index 942f4fa341f1..121c0114439e 100644
--- a/arch/x86/mm/pgtable.c
+++ b/arch/x86/mm/pgtable.c
@@ -710,7 +710,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;
+
+   pud_clear(pud);
+   free_page((unsigned long)pmd);
+
+   return 1;
 }
 
 /**
@@ -720,6 +735,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);
+   pmd_clear(pmd);
+   free_page((unsigned long)pte);
+
+   return 1;
 }
 #endif /* CONFIG_HAVE_ARCH_HUGE_VMAP */