linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Qian Cai <cai@lca.pw>
To: linux-kernel@vger.kernel.org, akpm@linux-foundation.org,
	anshuman.khandual@arm.com, anton.ivanov@cambridgegreys.com,
	aou@eecs.berkeley.edu, arnd@arndb.de, catalin.marinas@arm.com,
	deanbo422@gmail.com, deller@gmx.de, geert@linux-m68k.org,
	green.hu@gmail.com, guoren@kernel.org, gxt@pku.edu.cn,
	lftan@altera.com, linux@armlinux.org.uk, mattst88@gmail.com,
	mhocko@suse.com, mm-commits@vger.kernel.org, mpe@ellerman.id.au,
	palmer@sifive.com, paul.burton@mips.com, ralf@linux-mips.org,
	ren_guo@c-sky.com, richard@nod.at, rkuo@codeaurora.org,
	rppt@linux.ibm.com, sammy@sammy.net,
	torvalds@linux-foundation.org, willy@infradead.org
Subject: Re: [patch 105/147] arm64: switch to generic version of pte allocation
Date: Fri, 12 Jul 2019 08:49:07 -0400	[thread overview]
Message-ID: <1562935747.8510.26.camel@lca.pw> (raw)
In-Reply-To: <20190712035802.eeH5anzpz%akpm@linux-foundation.org>

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;
> _

       reply	other threads:[~2019-07-12 12:49 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20190712035802.eeH5anzpz%akpm@linux-foundation.org>
2019-07-12 12:49 ` Qian Cai [this message]
2019-07-12 18:20   ` [patch 105/147] arm64: switch to generic version of pte allocation Linus Torvalds
2019-07-12 19:53     ` Linus Torvalds
2019-07-12 21:10   ` Andrew Morton
2019-07-12 21:35     ` Linus Torvalds
2019-07-15  8:03       ` Will Deacon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1562935747.8510.26.camel@lca.pw \
    --to=cai@lca.pw \
    --cc=akpm@linux-foundation.org \
    --cc=anshuman.khandual@arm.com \
    --cc=anton.ivanov@cambridgegreys.com \
    --cc=aou@eecs.berkeley.edu \
    --cc=arnd@arndb.de \
    --cc=catalin.marinas@arm.com \
    --cc=deanbo422@gmail.com \
    --cc=deller@gmx.de \
    --cc=geert@linux-m68k.org \
    --cc=green.hu@gmail.com \
    --cc=guoren@kernel.org \
    --cc=gxt@pku.edu.cn \
    --cc=lftan@altera.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@armlinux.org.uk \
    --cc=mattst88@gmail.com \
    --cc=mhocko@suse.com \
    --cc=mm-commits@vger.kernel.org \
    --cc=mpe@ellerman.id.au \
    --cc=palmer@sifive.com \
    --cc=paul.burton@mips.com \
    --cc=ralf@linux-mips.org \
    --cc=ren_guo@c-sky.com \
    --cc=richard@nod.at \
    --cc=rkuo@codeaurora.org \
    --cc=rppt@linux.ibm.com \
    --cc=sammy@sammy.net \
    --cc=torvalds@linux-foundation.org \
    --cc=willy@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).