[PATCH] ARC: mm: fix leakage of memory allocated for PTE

Vineet Gupta vgupta at kernel.org
Tue Oct 18 17:24:31 PDT 2022


On 10/17/22 09:11, Pavel.Kozlov at synopsys.com wrote:
> From: Pavel Kozlov <pavel.kozlov at synopsys.com>
>
> Since commit d9820ff ("ARC: mm: switch pgtable_t back to struct page *")
> a memory leakage problem occurs. Memory allocated for page table entries
> not released during process termination. This issue can be reproduced by
> a small program that allocates a large amount of memory. After several
> runs, you'll see that the amount of free memory has reduced and will
> continue to reduce after each run. All ARC CPUs are effected by this
> issue. The issue was introduced since the kernel stable release v5.15-rc1.
>
> As described in commit d9820ff after switch pgtable_t back to struct
> page *, a pointer to "struct page" and appropriate functions are used to
> allocate and free a memory page for PTEs, but the pmd_pgtable macro hasn't
> changed and returns the direct virtual address from the PMD (PGD) entry.
> Than this address used as a parameter in the __pte_free() and as a result
> this function couldn't release memory page allocated for PTEs.
>
> Fix this issue by changing the pmd_pgtable macro and returning pointer to
> struct page.

Good catch. Curious how did you find it. KMEMCHECK or some such or just oom.

> Fixes: d9820ff76f95 ("ARC: mm: switch pgtable_t back to struct page *")
> Signed-off-by: Pavel Kozlov <pavel.kozlov at synopsys.com>
> Cc: Vineet Gupta <vgupta at kernel.org>
> Cc: Mike Rapoport <rppt at kernel.org>
> Cc: <stable at vger.kernel.org> # 4.15.x

You meant 5.15.x

Added to for-curr.

Thx,
-Vineet

> ---
>   arch/arc/include/asm/pgtable-levels.h | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/arc/include/asm/pgtable-levels.h b/arch/arc/include/asm/pgtable-levels.h
> index 64ca25d199be..ef68758b69f7 100644
> --- a/arch/arc/include/asm/pgtable-levels.h
> +++ b/arch/arc/include/asm/pgtable-levels.h
> @@ -161,7 +161,7 @@
>   #define pmd_pfn(pmd)		((pmd_val(pmd) & PAGE_MASK) >> PAGE_SHIFT)
>   #define pmd_page(pmd)		virt_to_page(pmd_page_vaddr(pmd))
>   #define set_pmd(pmdp, pmd)	(*(pmdp) = pmd)
> -#define pmd_pgtable(pmd)	((pgtable_t) pmd_page_vaddr(pmd))
> +#define pmd_pgtable(pmd)	((pgtable_t) pmd_page(pmd))
>   
>   /*
>    * 4th level paging: pte




More information about the linux-snps-arc mailing list