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;
> _
next parent 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).