aboutsummaryrefslogtreecommitdiffstats
path: root/arch/loongarch/mm/tlb.c
diff options
context:
space:
mode:
authorHuacai Chen <chenhuacai@loongson.cn>2022-10-12 16:36:08 +0800
committerHuacai Chen <chenhuacai@loongson.cn>2022-10-12 16:36:08 +0800
commit1299a129a9f927433ba792b242c1f287a96059e7 (patch)
tree5701a624a1d32b1845a79c567745887bd7537329 /arch/loongarch/mm/tlb.c
parentLoongArch: Do not create sysfs control file for io master CPUs (diff)
downloadlinux-dev-1299a129a9f927433ba792b242c1f287a96059e7.tar.xz
linux-dev-1299a129a9f927433ba792b242c1f287a96059e7.zip
LoongArch: Flush TLB earlier at initialization
Move local_flush_tlb_all() earlier (just after setup_ptwalker() and before page allocation). This can avoid stale TLB entries misguiding the later page allocation. Without this patch the second kernel of kexec/kdump fails to boot SMP. BTW, move output_pgtable_bits_defines() into tlb_init() since it has nothing to do with tlb handler setup. Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
Diffstat (limited to 'arch/loongarch/mm/tlb.c')
-rw-r--r--arch/loongarch/mm/tlb.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/loongarch/mm/tlb.c b/arch/loongarch/mm/tlb.c
index 9818ce11546b..da3681f131c8 100644
--- a/arch/loongarch/mm/tlb.c
+++ b/arch/loongarch/mm/tlb.c
@@ -258,7 +258,7 @@ extern long exception_handlers[VECSIZE * 128 / sizeof(long)];
void setup_tlb_handler(int cpu)
{
setup_ptwalker();
- output_pgtable_bits_defines();
+ local_flush_tlb_all();
/* The tlb handlers are generated only once */
if (cpu == 0) {
@@ -301,6 +301,7 @@ void tlb_init(int cpu)
write_csr_pagesize(PS_DEFAULT_SIZE);
write_csr_stlbpgsize(PS_DEFAULT_SIZE);
write_csr_tlbrefill_pagesize(PS_DEFAULT_SIZE);
+
setup_tlb_handler(cpu);
- local_flush_tlb_all();
+ output_pgtable_bits_defines();
}