Commit a09a9177 authored by Yicong Yang's avatar Yicong Yang Committed by JangShui Yang
Browse files

arm64: Enable ARCH_HAS_NONLEAF_PMD_YOUNG

mainline inclusion
from mainline-v6.13-rc1
commit 62df5870ebf7cec96a51c9b9008daf167e22db14
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/IB4YD4
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=62df5870ebf7cec96a51c9b9008daf167e22db14



----------------------------------------------------------------------

With the support of FEAT_HAFT, the NONLEAF_PMD_YOUNG can be enabled
on arm64 since the hardware is capable of updating the AF flag for
PMD table descriptor. Since the AF bit of the table descriptor
shares the same bit position in block descriptors, we only need
to implement arch_has_hw_nonleaf_pmd_young() and select related
configs. The related pmd_young test/update operations keeps the
same with and already implemented for transparent page support.

Currently ARCH_HAS_NONLEAF_PMD_YOUNG is used to improve the
efficiency of lru-gen aging.

Signed-off-by: default avatarYicong Yang <yangyicong@hisilicon.com>
Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Link: https://lore.kernel.org/r/20241102104235.62560-5-yangyicong@huawei.com


Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Conflicts:
	arch/arm64/Kconfig
[Context conflicts]
Signed-off-by: default avatarJiangShui Yang <yangjiangshui@h-partners.com>
parent 61bcbaac
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ config ARM64
	select ARCH_HAS_MEMBARRIER_SYNC_CORE
	select ARCH_HAS_NMI_SAFE_THIS_CPU_OPS
	select ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE
	select ARCH_HAS_NONLEAF_PMD_YOUNG if ARM64_HAFT
	select ARCH_HAS_PTE_DEVMAP
	select ARCH_HAS_PTE_SPECIAL
	select ARCH_HAS_SETUP_DMA_OPS
+6 −2
Original line number Diff line number Diff line
@@ -939,7 +939,7 @@ static inline int __ptep_clear_flush_young(struct vm_area_struct *vma,
	return young;
}

#ifdef CONFIG_TRANSPARENT_HUGEPAGE
#if defined(CONFIG_TRANSPARENT_HUGEPAGE) || defined(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG)
#define __HAVE_ARCH_PMDP_TEST_AND_CLEAR_YOUNG
static inline int pmdp_test_and_clear_young(struct vm_area_struct *vma,
					    unsigned long address,
@@ -947,7 +947,7 @@ static inline int pmdp_test_and_clear_young(struct vm_area_struct *vma,
{
	return __ptep_test_and_clear_young(vma, address, (pte_t *)pmdp);
}
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
#endif /* CONFIG_TRANSPARENT_HUGEPAGE || CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG */

static inline pte_t __ptep_get_and_clear(struct mm_struct *mm,
				       unsigned long address, pte_t *ptep)
@@ -1181,6 +1181,10 @@ static inline void update_mmu_cache_range(struct vm_fault *vmf,
 */
#define arch_has_hw_pte_young		cpu_has_hw_af

#ifdef CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG
#define arch_has_hw_nonleaf_pmd_young	system_supports_haft
#endif

/*
 * Experimentally, it's cheap to set the access flag in hardware and we
 * benefit from prefaulting mappings as 'old' to start with.