diff mbox series

arm64: mm: hugetlb: Disable HUGETLB_PAGE_OPTIMIZE_VMEMMAP

Message ID 20230222175232.540851-1-catalin.marinas@arm.com (mailing list archive)
State New, archived
Headers show
Series arm64: mm: hugetlb: Disable HUGETLB_PAGE_OPTIMIZE_VMEMMAP | expand

Commit Message

Catalin Marinas Feb. 22, 2023, 5:52 p.m. UTC
Revert the HUGETLB_PAGE_FREE_VMEMMAP selection from commit 1e63ac088f20
("arm64: mm: hugetlb: enable HUGETLB_PAGE_FREE_VMEMMAP for arm64") but
keep the flush_dcache_page() compound_head() change as it aligns with
the corresponding check in the __sync_icache_dcache() function.

The original config option was renamed in commit 47010c040dec ("mm:
hugetlb_vmemmap: cleanup CONFIG_HUGETLB_PAGE_FREE_VMEMMAP*") to
HUGETLB_PAGE_OPTIMIZE_VMEMMAP and the flush_dcache_page() check was
further simplified by commit 2da1c30929a2 ("mm: hugetlb_vmemmap: delete
hugetlb_optimize_vmemmap_enabled()").

The reason for the revert is that the generic vmemmap_remap_pte()
function changes both the permissions (writeable to read-only) and the
output address (pfn) of the vmemmap ptes. This is deemed UNPREDICTABLE
by the Arm architecture without a break-before-make sequence (make the
PTE invalid, TLBI, write the new valid PTE). However, such sequence is
not possible since the vmemmap may be concurrently accessed by the
kernel. Disable the optimisation until a better solution is found.

Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Fixes: 1e63ac088f20 ("arm64: mm: hugetlb: enable HUGETLB_PAGE_FREE_VMEMMAP for arm64")
Cc: <stable@vger.kernel.org> # 5.19.x
Cc: Muchun Song <muchun.song@linux.dev>
Cc: Will Deacon <will@kernel.org>
Cc: Anshuman Khandual <anshuman.khandual@arm.com>
Link: https://lore.kernel.org/r/Y9pZALdn3pKiJUeQ@arm.com
---
 arch/arm64/Kconfig | 1 -
 1 file changed, 1 deletion(-)


base-commit: b61b82f81e095fe265b0614045d17b08e6ee5c72

Comments

Anshuman Khandual Feb. 23, 2023, 3:22 a.m. UTC | #1
On 2/22/23 23:22, Catalin Marinas wrote:
> Revert the HUGETLB_PAGE_FREE_VMEMMAP selection from commit 1e63ac088f20
> ("arm64: mm: hugetlb: enable HUGETLB_PAGE_FREE_VMEMMAP for arm64") but
> keep the flush_dcache_page() compound_head() change as it aligns with
> the corresponding check in the __sync_icache_dcache() function.
> 
> The original config option was renamed in commit 47010c040dec ("mm:
> hugetlb_vmemmap: cleanup CONFIG_HUGETLB_PAGE_FREE_VMEMMAP*") to
> HUGETLB_PAGE_OPTIMIZE_VMEMMAP and the flush_dcache_page() check was
> further simplified by commit 2da1c30929a2 ("mm: hugetlb_vmemmap: delete
> hugetlb_optimize_vmemmap_enabled()").
> 
> The reason for the revert is that the generic vmemmap_remap_pte()
> function changes both the permissions (writeable to read-only) and the
> output address (pfn) of the vmemmap ptes. This is deemed UNPREDICTABLE
> by the Arm architecture without a break-before-make sequence (make the
> PTE invalid, TLBI, write the new valid PTE). However, such sequence is
> not possible since the vmemmap may be concurrently accessed by the
> kernel. Disable the optimisation until a better solution is found.
> 
> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
> Fixes: 1e63ac088f20 ("arm64: mm: hugetlb: enable HUGETLB_PAGE_FREE_VMEMMAP for arm64")
> Cc: <stable@vger.kernel.org> # 5.19.x
> Cc: Muchun Song <muchun.song@linux.dev>
> Cc: Will Deacon <will@kernel.org>
> Cc: Anshuman Khandual <anshuman.khandual@arm.com>
> Link: https://lore.kernel.org/r/Y9pZALdn3pKiJUeQ@arm.com

As per earlier discussions, this LGTM.

Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>

> ---
>  arch/arm64/Kconfig | 1 -
>  1 file changed, 1 deletion(-)
> 
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index 619ab046744a..71c35178e017 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -100,7 +100,6 @@ config ARM64
>  	select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT
>  	select ARCH_WANT_FRAME_POINTERS
>  	select ARCH_WANT_HUGE_PMD_SHARE if ARM64_4K_PAGES || (ARM64_16K_PAGES && !ARM64_VA_BITS_36)
> -	select ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP
>  	select ARCH_WANT_LD_ORPHAN_WARN
>  	select ARCH_WANTS_NO_INSTR
>  	select ARCH_WANTS_THP_SWAP if ARM64_4K_PAGES
> 
> base-commit: b61b82f81e095fe265b0614045d17b08e6ee5c72
Catalin Marinas Feb. 24, 2023, 3:05 p.m. UTC | #2
On Wed, 22 Feb 2023 17:52:32 +0000, Catalin Marinas wrote:
> Revert the HUGETLB_PAGE_FREE_VMEMMAP selection from commit 1e63ac088f20
> ("arm64: mm: hugetlb: enable HUGETLB_PAGE_FREE_VMEMMAP for arm64") but
> keep the flush_dcache_page() compound_head() change as it aligns with
> the corresponding check in the __sync_icache_dcache() function.
> 
> The original config option was renamed in commit 47010c040dec ("mm:
> hugetlb_vmemmap: cleanup CONFIG_HUGETLB_PAGE_FREE_VMEMMAP*") to
> HUGETLB_PAGE_OPTIMIZE_VMEMMAP and the flush_dcache_page() check was
> further simplified by commit 2da1c30929a2 ("mm: hugetlb_vmemmap: delete
> hugetlb_optimize_vmemmap_enabled()").
> 
> [...]

Applied to arm64 (for-next/core), thanks!

[1/1] arm64: mm: hugetlb: Disable HUGETLB_PAGE_OPTIMIZE_VMEMMAP
      https://git.kernel.org/arm64/c/060a2c92d1b6
diff mbox series

Patch

diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index 619ab046744a..71c35178e017 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -100,7 +100,6 @@  config ARM64
 	select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT
 	select ARCH_WANT_FRAME_POINTERS
 	select ARCH_WANT_HUGE_PMD_SHARE if ARM64_4K_PAGES || (ARM64_16K_PAGES && !ARM64_VA_BITS_36)
-	select ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP
 	select ARCH_WANT_LD_ORPHAN_WARN
 	select ARCH_WANTS_NO_INSTR
 	select ARCH_WANTS_THP_SWAP if ARM64_4K_PAGES