Unverified Commit 361454a6 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!6595 A Solution to Re-enable hugetlb vmemmap optimize on ARM64

Merge Pull Request from: @ci-robot 
 
PR sync from: Nanyong Sun <sunnanyong@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/7CO77USHXMQPQAMIXGO6QBX6676X7R3L/ 
HVO was previously disabled on arm64 [1] due to the lack of necessary
BBM(break-before-make) logic when changing page tables.
This set of patches fix this by adding necessary BBM sequence when
changing page table, and supporting vmemmap page fault handling to
fixup kernel address translation fault if vmemmap is concurrently accessed.

I have tested this patch set with concurrently accessing the vmemmap
address when do BBM and can recover by vmemmap fault handler. Also
tested under the config of 2/3/4 pgtable levels with 4K/64K page size
and all works well.

[1] commit 060a2c92 ("arm64: mm: hugetlb: Disable HUGETLB_PAGE_OPTIMIZE_VMEMMAP")

Nanyong Sun (4):
  mm: HVO: introduce helper function to update and flush pgtable
  arm64: mm: HVO: support BBM of vmemmap pgtable safely
  arm64: mm: Re-enable OPTIMIZE_HUGETLB_VMEMMAP
  arm64: update openeuler_defconfig for HVO enable


-- 
2.25.1
 
https://gitee.com/openeuler/kernel/issues/I9JCV4 
 
Link:https://gitee.com/openeuler/kernel/pulls/6595

 

Reviewed-by: default avatarKefeng Wang <wangkefeng.wang@huawei.com>
Reviewed-by: default avatarZhang Jianhua <chris.zjh@huawei.com>
Reviewed-by: default avatarLiu Chao <liuchao173@huawei.com>
Signed-off-by: default avatarXie XiuQi <xiexiuqi@huawei.com>
parents 13d5c424 fc9f881e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -104,6 +104,7 @@ 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_OPTIMIZE_HUGETLB_VMEMMAP if !PREEMPT_RT
	select ARCH_WANT_LD_ORPHAN_WARN
	select ARCH_WANTS_NO_INSTR
	select ARCH_WANTS_THP_SWAP if ARM64_4K_PAGES
+3 −0
Original line number Diff line number Diff line
@@ -1104,6 +1104,7 @@ CONFIG_SPARSEMEM=y
CONFIG_SPARSEMEM_EXTREME=y
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
CONFIG_SPARSEMEM_VMEMMAP=y
CONFIG_ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP=y
CONFIG_HAVE_FAST_GUP=y
CONFIG_ARCH_KEEP_MEMBLOCK=y
CONFIG_NUMA_KEEP_MEMINFO=y
@@ -7049,6 +7050,8 @@ CONFIG_TMPFS_XATTR=y
CONFIG_ARCH_SUPPORTS_HUGETLBFS=y
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y
# CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP_DEFAULT_ON is not set
CONFIG_HUGETLB_ALLOC_LIMIT=y
CONFIG_ARCH_HAS_GIGANTIC_PAGE=y
CONFIG_CONFIGFS_FS=y
+4 −0
Original line number Diff line number Diff line
@@ -116,6 +116,10 @@
#define ESR_ELx_FSC_SERROR	(0x11)
#define ESR_ELx_FSC_ACCESS	(0x08)
#define ESR_ELx_FSC_FAULT	(0x04)
#define ESR_ELx_FSC_FAULT_L0    (0x04)
#define ESR_ELx_FSC_FAULT_L1    (0x05)
#define ESR_ELx_FSC_FAULT_L2    (0x06)
#define ESR_ELx_FSC_FAULT_L3    (0x07)
#define ESR_ELx_FSC_PERM	(0x0C)
#define ESR_ELx_FSC_SEA_TTW0	(0x14)
#define ESR_ELx_FSC_SEA_TTW1	(0x15)
+7 −0
Original line number Diff line number Diff line
@@ -1453,6 +1453,13 @@ static inline int ptep_set_access_flags(struct vm_area_struct *vma,

#endif /* CONFIG_ARM64_CONTPTE */

#ifdef CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP
void vmemmap_update_pmd(unsigned long addr, pmd_t *pmdp, pte_t *ptep);
#define vmemmap_update_pmd vmemmap_update_pmd
void vmemmap_update_pte(unsigned long addr, pte_t *ptep, pte_t pte);
#define vmemmap_update_pte vmemmap_update_pte
#endif

#endif /* !__ASSEMBLY__ */

#endif /* __ASM_PGTABLE_H */
+16 −0
Original line number Diff line number Diff line
@@ -488,6 +488,22 @@ static inline void __flush_tlb_kernel_pgtable(unsigned long kaddr)
	dsb(ish);
	isb();
}

#ifdef CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP
static inline void vmemmap_flush_tlb_all(void)
{
	/* do nothing, already flushed tlb in every single BBM */
}
#define vmemmap_flush_tlb_all vmemmap_flush_tlb_all

static inline void vmemmap_flush_tlb_range(unsigned long start,
					   unsigned long end)
{
	/* do nothing, already flushed tlb in every single BBM */
}
#define vmemmap_flush_tlb_range vmemmap_flush_tlb_range
#endif

#endif

#endif
Loading