| From: "Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com> |
| Subject: mm/vmemmap optimization: split hugetlb and devdax vmemmap optimization |
| Date: Tue, 25 Jul 2023 00:37:53 +0530 |
| |
| Arm disabled hugetlb vmemmap optimization [1] because hugetlb vmemmap |
| optimization includes an update of both the permissions (writeable to |
| read-only) and the output address (pfn) of the vmemmap ptes. That is not |
| supported without unmapping of pte(marking it invalid) by some |
| architectures. |
| |
| With DAX vmemmap optimization we don't require such pte updates and |
| architectures can enable DAX vmemmap optimization while having hugetlb |
| vmemmap optimization disabled. Hence split DAX optimization support into |
| a different config. |
| |
| s390, loongarch and riscv don't have devdax support. So the DAX config is |
| not enabled for them. With this change, arm64 should be able to select |
| DAX optimization |
| |
| [1] commit 060a2c92d1b6 ("arm64: mm: hugetlb: Disable HUGETLB_PAGE_OPTIMIZE_VMEMMAP") |
| |
| Link: https://lkml.kernel.org/r/20230724190759.483013-8-aneesh.kumar@linux.ibm.com |
| Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> |
| Cc: Catalin Marinas <catalin.marinas@arm.com> |
| Cc: Christophe Leroy <christophe.leroy@csgroup.eu> |
| 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: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| arch/loongarch/Kconfig | 2 +- |
| arch/riscv/Kconfig | 2 +- |
| arch/s390/Kconfig | 2 +- |
| arch/x86/Kconfig | 3 ++- |
| fs/Kconfig | 2 +- |
| include/linux/mm.h | 2 +- |
| mm/Kconfig | 5 ++++- |
| 7 files changed, 11 insertions(+), 7 deletions(-) |
| |
| --- a/arch/loongarch/Kconfig~mm-vmemmap-optimization-split-hugetlb-and-devdax-vmemmap-optimization |
| +++ a/arch/loongarch/Kconfig |
| @@ -60,7 +60,7 @@ config LOONGARCH |
| select ARCH_USE_QUEUED_SPINLOCKS |
| select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT |
| select ARCH_WANT_LD_ORPHAN_WARN |
| - select ARCH_WANT_OPTIMIZE_VMEMMAP |
| + select ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP |
| select ARCH_WANTS_NO_INSTR |
| select BUILDTIME_TABLE_SORT |
| select COMMON_CLK |
| --- a/arch/riscv/Kconfig~mm-vmemmap-optimization-split-hugetlb-and-devdax-vmemmap-optimization |
| +++ a/arch/riscv/Kconfig |
| @@ -53,7 +53,7 @@ config RISCV |
| select ARCH_WANT_GENERAL_HUGETLB if !RISCV_ISA_SVNAPOT |
| select ARCH_WANT_HUGE_PMD_SHARE if 64BIT |
| select ARCH_WANT_LD_ORPHAN_WARN if !XIP_KERNEL |
| - select ARCH_WANT_OPTIMIZE_VMEMMAP |
| + select ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP |
| select ARCH_WANTS_THP_SWAP if HAVE_ARCH_TRANSPARENT_HUGEPAGE |
| select BINFMT_FLAT_NO_DATA_START_OFFSET if !MMU |
| select BUILDTIME_TABLE_SORT if MMU |
| --- a/arch/s390/Kconfig~mm-vmemmap-optimization-split-hugetlb-and-devdax-vmemmap-optimization |
| +++ a/arch/s390/Kconfig |
| @@ -127,7 +127,7 @@ config S390 |
| select ARCH_WANTS_NO_INSTR |
| select ARCH_WANT_DEFAULT_BPF_JIT |
| select ARCH_WANT_IPC_PARSE_VERSION |
| - select ARCH_WANT_OPTIMIZE_VMEMMAP |
| + select ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP |
| select BUILDTIME_TABLE_SORT |
| select CLONE_BACKWARDS2 |
| select DMA_OPS if PCI |
| --- a/arch/x86/Kconfig~mm-vmemmap-optimization-split-hugetlb-and-devdax-vmemmap-optimization |
| +++ a/arch/x86/Kconfig |
| @@ -128,7 +128,8 @@ config X86 |
| select ARCH_WANT_GENERAL_HUGETLB |
| select ARCH_WANT_HUGE_PMD_SHARE |
| select ARCH_WANT_LD_ORPHAN_WARN |
| - select ARCH_WANT_OPTIMIZE_VMEMMAP if X86_64 |
| + select ARCH_WANT_OPTIMIZE_DAX_VMEMMAP if X86_64 |
| + select ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP if X86_64 |
| select ARCH_WANTS_THP_SWAP if X86_64 |
| select ARCH_HAS_PARANOID_L1D_FLUSH |
| select BUILDTIME_TABLE_SORT |
| --- a/fs/Kconfig~mm-vmemmap-optimization-split-hugetlb-and-devdax-vmemmap-optimization |
| +++ a/fs/Kconfig |
| @@ -254,7 +254,7 @@ config HUGETLB_PAGE |
| |
| config HUGETLB_PAGE_OPTIMIZE_VMEMMAP |
| def_bool HUGETLB_PAGE |
| - depends on ARCH_WANT_OPTIMIZE_VMEMMAP |
| + depends on ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP |
| depends on SPARSEMEM_VMEMMAP |
| |
| config HUGETLB_PAGE_OPTIMIZE_VMEMMAP_DEFAULT_ON |
| --- a/include/linux/mm.h~mm-vmemmap-optimization-split-hugetlb-and-devdax-vmemmap-optimization |
| +++ a/include/linux/mm.h |
| @@ -3633,7 +3633,7 @@ void vmemmap_free(unsigned long start, u |
| #endif |
| |
| #define VMEMMAP_RESERVE_NR 2 |
| -#ifdef CONFIG_ARCH_WANT_OPTIMIZE_VMEMMAP |
| +#ifdef CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP |
| static inline bool __vmemmap_can_optimize(struct vmem_altmap *altmap, |
| struct dev_pagemap *pgmap) |
| { |
| --- a/mm/Kconfig~mm-vmemmap-optimization-split-hugetlb-and-devdax-vmemmap-optimization |
| +++ a/mm/Kconfig |
| @@ -487,7 +487,10 @@ config SPARSEMEM_VMEMMAP |
| # Select this config option from the architecture Kconfig, if it is preferred |
| # to enable the feature of HugeTLB/dev_dax vmemmap optimization. |
| # |
| -config ARCH_WANT_OPTIMIZE_VMEMMAP |
| +config ARCH_WANT_OPTIMIZE_DAX_VMEMMAP |
| + bool |
| + |
| +config ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP |
| bool |
| |
| config HAVE_MEMBLOCK_PHYS_MAP |
| _ |