Commit 348ad160 authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Andrew Morton

mm/hugepage pud: allow arch-specific helper function to check huge page pud support

Patch series "Add support for DAX vmemmap optimization for ppc64", v6.

This patch series implements changes required to support DAX vmemmap
optimization for ppc64.  The vmemmap optimization is only enabled with
radix MMU translation and 1GB PUD mapping with 64K page size.

The patch series also splits the hugetlb vmemmap optimization as a
separate Kconfig variable so that architectures can enable DAX vmemmap
optimization without enabling hugetlb vmemmap optimization.  This should
enable architectures like arm64 to enable DAX vmemmap optimization while
they can't enable hugetlb vmemmap optimization.  More details of the same
are in patch "mm/vmemmap optimization: Split hugetlb and devdax vmemmap
optimization".

With 64K page size for 16384 pages added (1G) we save 14 pages
With 4K page size for 262144 pages added (1G) we save 4094 pages
With 4K page size for 512 pages added (2M) we save 6 pages


This patch (of 13):

Architectures like powerpc would like to enable transparent huge page pud
support only with radix translation.  To support that add
has_transparent_pud_hugepage() helper that architectures can override.

[aneesh.kumar@linux.ibm.com: use the new has_transparent_pud_hugepage()]
  Link: https://lkml.kernel.org/r/87tttrvtaj.fsf@linux.ibm.com
Link: https://lkml.kernel.org/r/20230724190759.483013-1-aneesh.kumar@linux.ibm.com
Link: https://lkml.kernel.org/r/20230724190759.483013-2-aneesh.kumar@linux.ibm.comSigned-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Reviewed-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Joao Martins <joao.m.martins@oracle.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Mike Kravetz <mike.kravetz@oracle.com>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 063e60d8
...@@ -100,7 +100,7 @@ static unsigned long *nd_pfn_supported_alignments(unsigned long *alignments) ...@@ -100,7 +100,7 @@ static unsigned long *nd_pfn_supported_alignments(unsigned long *alignments)
if (has_transparent_hugepage()) { if (has_transparent_hugepage()) {
alignments[1] = HPAGE_PMD_SIZE; alignments[1] = HPAGE_PMD_SIZE;
if (IS_ENABLED(CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD)) if (has_transparent_pud_hugepage())
alignments[2] = HPAGE_PUD_SIZE; alignments[2] = HPAGE_PUD_SIZE;
} }
......
...@@ -1505,6 +1505,9 @@ typedef unsigned int pgtbl_mod_mask; ...@@ -1505,6 +1505,9 @@ typedef unsigned int pgtbl_mod_mask;
#define has_transparent_hugepage() IS_BUILTIN(CONFIG_TRANSPARENT_HUGEPAGE) #define has_transparent_hugepage() IS_BUILTIN(CONFIG_TRANSPARENT_HUGEPAGE)
#endif #endif
#ifndef has_transparent_pud_hugepage
#define has_transparent_pud_hugepage() IS_BUILTIN(CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD)
#endif
/* /*
* On some architectures it depends on the mm if the p4d/pud or pmd * On some architectures it depends on the mm if the p4d/pud or pmd
* layer of the page table hierarchy is folded or not. * layer of the page table hierarchy is folded or not.
......
...@@ -302,7 +302,7 @@ static void __init pud_basic_tests(struct pgtable_debug_args *args, int idx) ...@@ -302,7 +302,7 @@ static void __init pud_basic_tests(struct pgtable_debug_args *args, int idx)
unsigned long val = idx, *ptr = &val; unsigned long val = idx, *ptr = &val;
pud_t pud; pud_t pud;
if (!has_transparent_hugepage()) if (!has_transparent_pud_hugepage())
return; return;
pr_debug("Validating PUD basic (%pGv)\n", ptr); pr_debug("Validating PUD basic (%pGv)\n", ptr);
...@@ -343,7 +343,7 @@ static void __init pud_advanced_tests(struct pgtable_debug_args *args) ...@@ -343,7 +343,7 @@ static void __init pud_advanced_tests(struct pgtable_debug_args *args)
unsigned long vaddr = args->vaddr; unsigned long vaddr = args->vaddr;
pud_t pud; pud_t pud;
if (!has_transparent_hugepage()) if (!has_transparent_pud_hugepage())
return; return;
page = (args->pud_pfn != ULONG_MAX) ? pfn_to_page(args->pud_pfn) : NULL; page = (args->pud_pfn != ULONG_MAX) ? pfn_to_page(args->pud_pfn) : NULL;
...@@ -405,7 +405,7 @@ static void __init pud_leaf_tests(struct pgtable_debug_args *args) ...@@ -405,7 +405,7 @@ static void __init pud_leaf_tests(struct pgtable_debug_args *args)
{ {
pud_t pud; pud_t pud;
if (!has_transparent_hugepage()) if (!has_transparent_pud_hugepage())
return; return;
pr_debug("Validating PUD leaf\n"); pr_debug("Validating PUD leaf\n");
...@@ -732,7 +732,7 @@ static void __init pud_devmap_tests(struct pgtable_debug_args *args) ...@@ -732,7 +732,7 @@ static void __init pud_devmap_tests(struct pgtable_debug_args *args)
{ {
pud_t pud; pud_t pud;
if (!has_transparent_hugepage()) if (!has_transparent_pud_hugepage())
return; return;
pr_debug("Validating PUD devmap\n"); pr_debug("Validating PUD devmap\n");
...@@ -981,7 +981,7 @@ static void __init pud_thp_tests(struct pgtable_debug_args *args) ...@@ -981,7 +981,7 @@ static void __init pud_thp_tests(struct pgtable_debug_args *args)
{ {
pud_t pud; pud_t pud;
if (!has_transparent_hugepage()) if (!has_transparent_pud_hugepage())
return; return;
pr_debug("Validating PUD based THP\n"); pr_debug("Validating PUD based THP\n");
...@@ -1022,8 +1022,7 @@ static void __init destroy_args(struct pgtable_debug_args *args) ...@@ -1022,8 +1022,7 @@ static void __init destroy_args(struct pgtable_debug_args *args)
/* Free (huge) page */ /* Free (huge) page */
if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) && if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) &&
IS_ENABLED(CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD) && has_transparent_pud_hugepage() &&
has_transparent_hugepage() &&
args->pud_pfn != ULONG_MAX) { args->pud_pfn != ULONG_MAX) {
if (args->is_contiguous_page) { if (args->is_contiguous_page) {
free_contig_range(args->pud_pfn, free_contig_range(args->pud_pfn,
...@@ -1274,8 +1273,7 @@ static int __init init_args(struct pgtable_debug_args *args) ...@@ -1274,8 +1273,7 @@ static int __init init_args(struct pgtable_debug_args *args)
* if we fail to allocate (huge) pages. * if we fail to allocate (huge) pages.
*/ */
if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) && if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) &&
IS_ENABLED(CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD) && has_transparent_pud_hugepage()) {
has_transparent_hugepage()) {
page = debug_vm_pgtable_alloc_huge_page(args, page = debug_vm_pgtable_alloc_huge_page(args,
HPAGE_PUD_SHIFT - PAGE_SHIFT); HPAGE_PUD_SHIFT - PAGE_SHIFT);
if (page) { if (page) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment