LoongArch: Flush TLB earlier at initialization
authorHuacai Chen <chenhuacai@loongson.cn>
Wed, 12 Oct 2022 08:36:08 +0000 (16:36 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Wed, 12 Oct 2022 08:36:08 +0000 (16:36 +0800)
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>
arch/loongarch/mm/tlb.c

index 9818ce11546bcb502415dbe7e000d1798ae4aac4..da3681f131c8d8a722b7f479775f7a48be47fc0a 100644 (file)
@@ -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();
 }