lkml.org 
[lkml]   [2019]   [Jul]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
SubjectRe: [patch 105/147] arm64: switch to generic version of pte allocation
From
Date
Actually, this patch is slightly off. There is one delta need to apply (ignore
the part in pgtable.h which has already in mainline via the commit 615c48ad8f42
"arm64/mm: don't initialize pgd_cache twice") in.

https://lore.kernel.org/linux-mm/20190617151252.GF16810@rapoport-lnx/

On Thu, 2019-07-11 at 20:58 -0700, akpm@linux-foundation.org wrote:
> From: Mike Rapoport <rppt@linux.ibm.com>
> Subject: arm64: switch to generic version of pte allocation
>
> The PTE allocations in arm64 are identical to the generic ones modulo the
> GFP flags.
>
> Using the generic pte_alloc_one() functions ensures that the user page
> tables are allocated with __GFP_ACCOUNT set.
>
> The arm64 definition of PGALLOC_GFP is removed and replaced with
> GFP_PGTABLE_USER for p[gum]d_alloc_one() for the user page tables andpgtable.h
>
> GFP_PGTABLE_KERNEL for the kernel page tables. The KVM memory cache is now
> using GFP_PGTABLE_USER.
>
> The mappings created with create_pgd_mapping() are now using
> GFP_PGTABLE_KERNEL.
>
> The conversion to the generic version of pte_free_kernel() removes the NULL
> check for pte.
>
> The pte_free() version on arm64 is identical to the generic one and
> can be simply dropped.
>
> [cai@lca.pw: fix a bogus GFP flag in pgd_alloc()]
>   Link: http://lkml.kernel.org/r/1559656836-24940-1-git-send-email-cai@lca.pw
> Link: http://lkml.kernel.org/r/1557296232-15361-5-git-send-email-rppt@linux.ib
> m.com
> Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
> Cc: Albert Ou <aou@eecs.berkeley.edu>
> Cc: Anshuman Khandual <anshuman.khandual@arm.com>
> Cc: Anton Ivanov <anton.ivanov@cambridgegreys.com>
> Cc: Arnd Bergmann <arnd@arndb.de>
> Cc: Catalin Marinas <catalin.marinas@arm.com>
> Cc: Geert Uytterhoeven <geert@linux-m68k.org>
> Cc: Greentime Hu <green.hu@gmail.com>
> Cc: Guan Xuetao <gxt@pku.edu.cn>
> Cc: Guo Ren <guoren@kernel.org>
> Cc: Guo Ren <ren_guo@c-sky.com>
> Cc: Helge Deller <deller@gmx.de>
> Cc: Ley Foon Tan <lftan@altera.com>
> Cc: Matthew Wilcox <willy@infradead.org>
> Cc: Matt Turner <mattst88@gmail.com>
> Cc: Michael Ellerman <mpe@ellerman.id.au>
> Cc: Michal Hocko <mhocko@suse.com>
> Cc: Palmer Dabbelt <palmer@sifive.com>
> Cc: Paul Burton <paul.burton@mips.com>
> Cc: Ralf Baechle <ralf@linux-mips.org>
> Cc: Richard Kuo <rkuo@codeaurora.org>
> Cc: Richard Weinberger <richard@nod.at>
> Cc: Russell King <linux@armlinux.org.uk>
> Cc: Sam Creasey <sammy@sammy.net>
> Cc: Vincent Chen <deanbo422@gmail.com>
> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
> ---
>
>  arch/arm64/include/asm/pgalloc.h |   47 ++++-------------------------
>  arch/arm64/mm/mmu.c              |    2 -
>  arch/arm64/mm/pgd.c              |    9 ++++-
>  virt/kvm/arm/mmu.c               |    2 -
>  4 files changed, 17 insertions(+), 43 deletions(-)
>
> --- a/arch/arm64/include/asm/pgalloc.h~arm64-switch-to-generic-version-of-pte-
> allocation
> +++ a/arch/arm64/include/asm/pgalloc.h
> @@ -13,18 +13,23 @@
>  #include <asm/cacheflush.h>
>  #include <asm/tlbflush.h>
>  
> +#include <asm-generic/pgalloc.h> /* for pte_{alloc,free}_one */
> +
>  #define check_pgt_cache() do { } while (0)
>  
> -#define PGALLOC_GFP (GFP_KERNEL | __GFP_ZERO)
>  #define PGD_SIZE (PTRS_PER_PGD * sizeof(pgd_t))
>  
>  #if CONFIG_PGTABLE_LEVELS > 2
>  
>  static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
>  {
> + gfp_t gfp = GFP_PGTABLE_USER;
>   struct page *page;
>  
> - page = alloc_page(PGALLOC_GFP);
> + if (mm == &init_mm)
> + gfp = GFP_PGTABLE_KERNEL;
> +
> + page = alloc_page(gfp);
>   if (!page)
>   return NULL;
>   if (!pgtable_pmd_page_ctor(page)) {
> @@ -61,7 +66,7 @@ static inline void __pud_populate(pud_t
>  
>  static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr)
>  {
> - return (pud_t *)__get_free_page(PGALLOC_GFP);
> + return (pud_t *)__get_free_page(GFP_PGTABLE_USER);
>  }
>  
>  static inline void pud_free(struct mm_struct *mm, pud_t *pudp)
> @@ -89,42 +94,6 @@ static inline void __pgd_populate(pgd_t
>  extern pgd_t *pgd_alloc(struct mm_struct *mm);
>  extern void pgd_free(struct mm_struct *mm, pgd_t *pgdp);
>  
> -static inline pte_t *
> -pte_alloc_one_kernel(struct mm_struct *mm)
> -{
> - return (pte_t *)__get_free_page(PGALLOC_GFP);
> -}
> -
> -static inline pgtable_t
> -pte_alloc_one(struct mm_struct *mm)
> -{
> - struct page *pte;
> -
> - pte = alloc_pages(PGALLOC_GFP, 0);
> - if (!pte)
> - return NULL;
> - if (!pgtable_page_ctor(pte)) {
> - __free_page(pte);
> - return NULL;
> - }
> - return pte;
> -}
> -
> -/*
> - * Free a PTE table.
> - */
> -static inline void pte_free_kernel(struct mm_struct *mm, pte_t *ptep)
> -{
> - if (ptep)
> - free_page((unsigned long)ptep);
> -}
> -
> -static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
> -{
> - pgtable_page_dtor(pte);
> - __free_page(pte);
> -}
> -
>  static inline void __pmd_populate(pmd_t *pmdp, phys_addr_t ptep,
>     pmdval_t prot)
>  {
> --- a/arch/arm64/mm/mmu.c~arm64-switch-to-generic-version-of-pte-allocation
> +++ a/arch/arm64/mm/mmu.c
> @@ -362,7 +362,7 @@ static void __create_pgd_mapping(pgd_t *
>  
>  static phys_addr_t __pgd_pgtable_alloc(int shift)
>  {
> - void *ptr = (void *)__get_free_page(PGALLOC_GFP);
> + void *ptr = (void *)__get_free_page(GFP_PGTABLE_KERNEL);
>   BUG_ON(!ptr);
>  
>   /* Ensure the zeroed page is visible to the page table walker */
> --- a/arch/arm64/mm/pgd.c~arm64-switch-to-generic-version-of-pte-allocation
> +++ a/arch/arm64/mm/pgd.c
> @@ -19,10 +19,15 @@ static struct kmem_cache *pgd_cache __ro
>  
>  pgd_t *pgd_alloc(struct mm_struct *mm)
>  {
> + gfp_t gfp = GFP_PGTABLE_USER;
> +
> + if (unlikely(mm == &init_mm))
> + gfp = GFP_PGTABLE_KERNEL;
> +
>   if (PGD_SIZE == PAGE_SIZE)
> - return (pgd_t *)__get_free_page(PGALLOC_GFP);
> + return (pgd_t *)__get_free_page(gfp);
>   else
> - return kmem_cache_alloc(pgd_cache, PGALLOC_GFP);
> + return kmem_cache_alloc(pgd_cache, GFP_PGTABLE_KERNEL);
>  }
>  
>  void pgd_free(struct mm_struct *mm, pgd_t *pgd)
> --- a/virt/kvm/arm/mmu.c~arm64-switch-to-generic-version-of-pte-allocation
> +++ a/virt/kvm/arm/mmu.c
> @@ -129,7 +129,7 @@ static int mmu_topup_memory_cache(struct
>   if (cache->nobjs >= min)
>   return 0;
>   while (cache->nobjs < max) {
> - page = (void *)__get_free_page(PGALLOC_GFP);
> + page = (void *)__get_free_page(GFP_PGTABLE_USER);
>   if (!page)
>   return -ENOMEM;
>   cache->objects[cache->nobjs++] = page;
> _

\
 
 \ /
  Last update: 2019-07-12 14:49    [W:0.058 / U:1.408 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site