diff options
author | Alexandre Ghiti <alexghiti@rivosinc.com> | 2023-12-12 22:34:56 +0100 |
---|---|---|
committer | Dennis Zhou <dennis@kernel.org> | 2023-12-14 09:23:17 +0100 |
commit | 7a92fc8b4d20680e4c20289a670d8fca2d1f2c1b (patch) | |
tree | f02aada180e46f0f74910d88d85b96c0f181061e /arch/riscv/include/asm/tlbflush.h | |
parent | Linux 6.7-rc4 (diff) | |
download | linux-7a92fc8b4d20680e4c20289a670d8fca2d1f2c1b.tar.xz linux-7a92fc8b4d20680e4c20289a670d8fca2d1f2c1b.zip |
mm: Introduce flush_cache_vmap_early()
The pcpu setup when using the page allocator sets up a new vmalloc
mapping very early in the boot process, so early that it cannot use the
flush_cache_vmap() function which may depend on structures not yet
initialized (for example in riscv, we currently send an IPI to flush
other cpus TLB).
But on some architectures, we must call flush_cache_vmap(): for example,
in riscv, some uarchs can cache invalid TLB entries so we need to flush
the new established mapping to avoid taking an exception.
So fix this by introducing a new function flush_cache_vmap_early() which
is called right after setting the new page table entry and before
accessing this new mapping. This new function implements a local flush
tlb on riscv and is no-op for other architectures (same as today).
Signed-off-by: Alexandre Ghiti <alexghiti@rivosinc.com>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Dennis Zhou <dennis@kernel.org>
Diffstat (limited to 'arch/riscv/include/asm/tlbflush.h')
-rw-r--r-- | arch/riscv/include/asm/tlbflush.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/arch/riscv/include/asm/tlbflush.h b/arch/riscv/include/asm/tlbflush.h index 8f3418c5f172..a60416bbe190 100644 --- a/arch/riscv/include/asm/tlbflush.h +++ b/arch/riscv/include/asm/tlbflush.h @@ -41,6 +41,7 @@ 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); void flush_tlb_kernel_range(unsigned long start, unsigned long end); +void local_flush_tlb_kernel_range(unsigned long start, unsigned long end); #ifdef CONFIG_TRANSPARENT_HUGEPAGE #define __HAVE_ARCH_FLUSH_PMD_TLB_RANGE void flush_pmd_tlb_range(struct vm_area_struct *vma, unsigned long start, |