Skip to content

Commit 2bc5bab

Browse files
Yaliang Wangtsbogend
authored andcommitted
MIPS: pgalloc: fix memory leak caused by pgd_free()
pgd page is freed by generic implementation pgd_free() since commit f9cb654 ("asm-generic: pgalloc: provide generic pgd_free()"), however, there are scenarios that the system uses more than one page as the pgd table, in such cases the generic implementation pgd_free() won't be applicable anymore. For example, when PAGE_SIZE_4KB is enabled and MIPS_VA_BITS_48 is not enabled in a 64bit system, the macro "PGD_ORDER" will be set as "1", which will cause allocating two pages as the pgd table. Well, at the same time, the generic implementation pgd_free() just free one pgd page, which will result in the memory leak. The memory leak can be easily detected by executing shell command: "while true; do ls > /dev/null; grep MemFree /proc/meminfo; done" Fixes: f9cb654 ("asm-generic: pgalloc: provide generic pgd_free()") Signed-off-by: Yaliang Wang <Yaliang.Wang@windriver.com> Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
1 parent 8755d57 commit 2bc5bab

1 file changed

Lines changed: 6 additions & 0 deletions

File tree

arch/mips/include/asm/pgalloc.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#define __HAVE_ARCH_PMD_ALLOC_ONE
1717
#define __HAVE_ARCH_PUD_ALLOC_ONE
18+
#define __HAVE_ARCH_PGD_FREE
1819
#include <asm-generic/pgalloc.h>
1920

2021
static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd,
@@ -48,6 +49,11 @@ static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
4849
extern void pgd_init(unsigned long page);
4950
extern pgd_t *pgd_alloc(struct mm_struct *mm);
5051

52+
static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
53+
{
54+
free_pages((unsigned long)pgd, PGD_ORDER);
55+
}
56+
5157
#define __pte_free_tlb(tlb,pte,address) \
5258
do { \
5359
pgtable_pte_page_dtor(pte); \

0 commit comments

Comments
 (0)