]> www.infradead.org Git - users/willy/xarray.git/commitdiff
riscv: smp: fail booting up smp if inconsistent vlen is detected
authorAndy Chiu <andy.chiu@sifive.com>
Thu, 9 May 2024 16:26:52 +0000 (00:26 +0800)
committerPalmer Dabbelt <palmer@rivosinc.com>
Thu, 30 May 2024 21:33:05 +0000 (14:33 -0700)
Currently we only support Vector for SMP platforms, that is, all SMP
cores have the same vlenb. If we happen to detect a mismatching vlen, it
is better to just fail bootting it up to prevent further race/scheduling
issues.

Also, move .Lsecondary_park forward and chage `tail smp_callin` into a
regular call in the early assembly. So a core would be parked right
after a return from smp_callin. Note that a successful smp_callin
does not return.

Fixes: 7017858eb2d7 ("riscv: Introduce riscv_v_vsize to record size of Vector context")
Reported-by: Conor Dooley <conor.dooley@microchip.com>
Closes: https://lore.kernel.org/linux-riscv/20240228-vicinity-cornstalk-4b8eb5fe5730@spud/
Signed-off-by: Andy Chiu <andy.chiu@sifive.com>
Reviewed-by: Conor Dooley <conor.dooley@microchip.com>
Reviewed-by: Yunhui Cui <cuiyunhui@bytedance.com>
Link: https://lore.kernel.org/r/20240510-zve-detection-v5-2-0711bdd26c12@sifive.com
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
arch/riscv/kernel/head.S
arch/riscv/kernel/smpboot.c

index 4236a69c35cb33524cdb7190d8ecb294768d8e56..a00f7523cb91f20516df57a2a05cf70343773e32 100644 (file)
@@ -165,9 +165,20 @@ secondary_start_sbi:
 #endif
        call .Lsetup_trap_vector
        scs_load_current
-       tail smp_callin
+       call smp_callin
 #endif /* CONFIG_SMP */
 
+.align 2
+.Lsecondary_park:
+       /*
+        * Park this hart if we:
+        *  - have too many harts on CONFIG_RISCV_BOOT_SPINWAIT
+        *  - receive an early trap, before setup_trap_vector finished
+        *  - fail in smp_callin(), as a successful one wouldn't return
+        */
+       wfi
+       j .Lsecondary_park
+
 .align 2
 .Lsetup_trap_vector:
        /* Set trap vector to exception handler */
@@ -181,12 +192,6 @@ secondary_start_sbi:
        csrw CSR_SCRATCH, zero
        ret
 
-.align 2
-.Lsecondary_park:
-       /* We lack SMP support or have too many harts, so park this hart */
-       wfi
-       j .Lsecondary_park
-
 SYM_CODE_END(_start)
 
 SYM_CODE_START(_start_kernel)
index 1319b29ce3b59bd4daa203acad44919b9d05db24..19baf0d574d359bdbdfaeaef91c8dd7a6398e685 100644 (file)
@@ -214,6 +214,15 @@ asmlinkage __visible void smp_callin(void)
        struct mm_struct *mm = &init_mm;
        unsigned int curr_cpuid = smp_processor_id();
 
+       if (has_vector()) {
+               /*
+                * Return as early as possible so the hart with a mismatching
+                * vlen won't boot.
+                */
+               if (riscv_v_setup_vsize())
+                       return;
+       }
+
        /* All kernel threads share the same mm context.  */
        mmgrab(mm);
        current->active_mm = mm;
@@ -226,11 +235,6 @@ asmlinkage __visible void smp_callin(void)
        numa_add_cpu(curr_cpuid);
        set_cpu_online(curr_cpuid, true);
 
-       if (has_vector()) {
-               if (riscv_v_setup_vsize())
-                       elf_hwcap &= ~COMPAT_HWCAP_ISA_V;
-       }
-
        riscv_user_isa_enable();
 
        /*