Message ID | 20231028231339.3116618-3-samuel.holland@sifive.com (mailing list archive) |
---|---|
State | Superseded |
Commit | c962a6e7463980a513e990a7a8a9967e529ad467 |
Headers | show |
Series | riscv: ASID-related and UP-related TLB flush enhancements | expand |
Context | Check | Description |
---|---|---|
conchuod/vmtest-for-next-PR | fail | PR summary |
conchuod/patch-2-test-1 | fail | .github/scripts/patches/build_rv32_defconfig.sh |
conchuod/patch-2-test-2 | fail | .github/scripts/patches/build_rv64_clang_allmodconfig.sh |
conchuod/patch-2-test-3 | fail | .github/scripts/patches/build_rv64_gcc_allmodconfig.sh |
conchuod/patch-2-test-4 | fail | .github/scripts/patches/build_rv64_nommu_k210_defconfig.sh |
conchuod/patch-2-test-5 | fail | .github/scripts/patches/build_rv64_nommu_virt_defconfig.sh |
conchuod/patch-2-test-6 | success | .github/scripts/patches/checkpatch.sh |
conchuod/patch-2-test-7 | success | .github/scripts/patches/dtb_warn_rv64.sh |
conchuod/patch-2-test-8 | success | .github/scripts/patches/header_inline.sh |
conchuod/patch-2-test-9 | success | .github/scripts/patches/kdoc.sh |
conchuod/patch-2-test-10 | success | .github/scripts/patches/module_param.sh |
conchuod/patch-2-test-11 | success | .github/scripts/patches/verify_fixes.sh |
conchuod/patch-2-test-12 | success | .github/scripts/patches/verify_signedoff.sh |
diff --git a/arch/riscv/mm/tlbflush.c b/arch/riscv/mm/tlbflush.c index fa03289853d8..b6d712a82306 100644 --- a/arch/riscv/mm/tlbflush.c +++ b/arch/riscv/mm/tlbflush.c @@ -3,6 +3,7 @@ #include <linux/mm.h> #include <linux/smp.h> #include <linux/sched.h> +#include <linux/hugetlb.h> #include <asm/sbi.h> #include <asm/mmu_context.h> @@ -147,7 +148,33 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long addr) void flush_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end) { - __flush_tlb_range(vma->vm_mm, start, end - start, PAGE_SIZE); + unsigned long stride_size; + + if (!is_vm_hugetlb_page(vma)) { + stride_size = PAGE_SIZE; + } else { + stride_size = huge_page_size(hstate_vma(vma)); + + /* + * As stated in the privileged specification, every PTE in a + * NAPOT region must be invalidated, so reset the stride in that + * case. + */ + if (has_svnapot()) { + if (stride_size >= PGDIR_SIZE) + stride_size = PGDIR_SIZE; + else if (stride_size >= P4D_SIZE) + stride_size = P4D_SIZE; + else if (stride_size >= PUD_SIZE) + stride_size = PUD_SIZE; + else if (stride_size >= PMD_SIZE) + stride_size = PMD_SIZE; + else + stride_size = PAGE_SIZE; + } + } + + __flush_tlb_range(vma->vm_mm, start, end - start, stride_size); } #ifdef CONFIG_TRANSPARENT_HUGEPAGE void flush_pmd_tlb_range(struct vm_area_struct *vma, unsigned long start,