Message ID | 1556810922-20248-15-git-send-email-rppt@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | introduce generic pte_{alloc,free}_one[_kernel] | expand |
On 02/05/2019 16:28, Mike Rapoport wrote: > um allocates PTE pages with __get_free_page() and uses > GFP_KERNEL | __GFP_ZERO for the allocations. > > Switch it to the generic version that does exactly the same thing for the > kernel page tables and adds __GFP_ACCOUNT for the user PTEs. > > The pte_free() and pte_free_kernel() versions are identical to the generic > ones and can be simply dropped. > > Signed-off-by: Mike Rapoport <rppt@linux.ibm.com> > --- > arch/um/include/asm/pgalloc.h | 16 ++-------------- > arch/um/kernel/mem.c | 22 ---------------------- > 2 files changed, 2 insertions(+), 36 deletions(-) > > diff --git a/arch/um/include/asm/pgalloc.h b/arch/um/include/asm/pgalloc.h > index 99eb568..d7b282e 100644 > --- a/arch/um/include/asm/pgalloc.h > +++ b/arch/um/include/asm/pgalloc.h > @@ -10,6 +10,8 @@ > > #include <linux/mm.h> > > +#include <asm-generic/pgalloc.h> /* for pte_{alloc,free}_one */ > + > #define pmd_populate_kernel(mm, pmd, pte) \ > set_pmd(pmd, __pmd(_PAGE_TABLE + (unsigned long) __pa(pte))) > > @@ -25,20 +27,6 @@ > extern pgd_t *pgd_alloc(struct mm_struct *); > extern void pgd_free(struct mm_struct *mm, pgd_t *pgd); > > -extern pte_t *pte_alloc_one_kernel(struct mm_struct *); > -extern pgtable_t pte_alloc_one(struct mm_struct *); > - > -static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) > -{ > - free_page((unsigned long) pte); > -} > - > -static inline void pte_free(struct mm_struct *mm, pgtable_t pte) > -{ > - pgtable_page_dtor(pte); > - __free_page(pte); > -} > - > #define __pte_free_tlb(tlb,pte, address) \ > do { \ > pgtable_page_dtor(pte); \ > diff --git a/arch/um/kernel/mem.c b/arch/um/kernel/mem.c > index 99aa11b..2280374 100644 > --- a/arch/um/kernel/mem.c > +++ b/arch/um/kernel/mem.c > @@ -215,28 +215,6 @@ void pgd_free(struct mm_struct *mm, pgd_t *pgd) > free_page((unsigned long) pgd); > } > > -pte_t *pte_alloc_one_kernel(struct mm_struct *mm) > -{ > - pte_t *pte; > - > - pte = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_ZERO); > - return pte; > -} > - > -pgtable_t pte_alloc_one(struct mm_struct *mm) > -{ > - struct page *pte; > - > - pte = alloc_page(GFP_KERNEL|__GFP_ZERO); > - if (!pte) > - return NULL; > - if (!pgtable_page_ctor(pte)) { > - __free_page(pte); > - return NULL; > - } > - return pte; > -} > - > #ifdef CONFIG_3_LEVEL_PGTABLES > pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) > { > Reviewed-by: Anton Ivanov <anton.ivanov@cambridgegreys.com> Acked-by: Anton Ivanov <anton.ivanov@cambridgegreys.com>
diff --git a/arch/um/include/asm/pgalloc.h b/arch/um/include/asm/pgalloc.h index 99eb568..d7b282e 100644 --- a/arch/um/include/asm/pgalloc.h +++ b/arch/um/include/asm/pgalloc.h @@ -10,6 +10,8 @@ #include <linux/mm.h> +#include <asm-generic/pgalloc.h> /* for pte_{alloc,free}_one */ + #define pmd_populate_kernel(mm, pmd, pte) \ set_pmd(pmd, __pmd(_PAGE_TABLE + (unsigned long) __pa(pte))) @@ -25,20 +27,6 @@ extern pgd_t *pgd_alloc(struct mm_struct *); extern void pgd_free(struct mm_struct *mm, pgd_t *pgd); -extern pte_t *pte_alloc_one_kernel(struct mm_struct *); -extern pgtable_t pte_alloc_one(struct mm_struct *); - -static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) -{ - free_page((unsigned long) pte); -} - -static inline void pte_free(struct mm_struct *mm, pgtable_t pte) -{ - pgtable_page_dtor(pte); - __free_page(pte); -} - #define __pte_free_tlb(tlb,pte, address) \ do { \ pgtable_page_dtor(pte); \ diff --git a/arch/um/kernel/mem.c b/arch/um/kernel/mem.c index 99aa11b..2280374 100644 --- a/arch/um/kernel/mem.c +++ b/arch/um/kernel/mem.c @@ -215,28 +215,6 @@ void pgd_free(struct mm_struct *mm, pgd_t *pgd) free_page((unsigned long) pgd); } -pte_t *pte_alloc_one_kernel(struct mm_struct *mm) -{ - pte_t *pte; - - pte = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_ZERO); - return pte; -} - -pgtable_t pte_alloc_one(struct mm_struct *mm) -{ - struct page *pte; - - pte = alloc_page(GFP_KERNEL|__GFP_ZERO); - if (!pte) - return NULL; - if (!pgtable_page_ctor(pte)) { - __free_page(pte); - return NULL; - } - return pte; -} - #ifdef CONFIG_3_LEVEL_PGTABLES pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) {
um allocates PTE pages with __get_free_page() and uses GFP_KERNEL | __GFP_ZERO for the allocations. Switch it to the generic version that does exactly the same thing for the kernel page tables and adds __GFP_ACCOUNT for the user PTEs. The pte_free() and pte_free_kernel() versions are identical to the generic ones and can be simply dropped. Signed-off-by: Mike Rapoport <rppt@linux.ibm.com> --- arch/um/include/asm/pgalloc.h | 16 ++-------------- arch/um/kernel/mem.c | 22 ---------------------- 2 files changed, 2 insertions(+), 36 deletions(-)