riscv: smp: fail booting up smp if inconsistent vlen is detected
BugLink: https://bugs.launchpad.net/bugs/2083196
[ Upstream commit 38a94c46660f5612c6ef37ec9754ec1543b038cd ]
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: 7017858eb2 ("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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Portia Stephens <portia.stephens@canonical.com>
Signed-off-by: Roxana Nicolescu <roxana.nicolescu@canonical.com>
This commit is contained in:
committed by
Mehmet Basaran
parent
6bbd103a61
commit
db621c3f32
@@ -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)
|
||||
|
||||
@@ -219,6 +219,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;
|
||||
@@ -231,11 +240,6 @@ asmlinkage __visible void smp_callin(void)
|
||||
numa_add_cpu(curr_cpuid);
|
||||
set_cpu_online(curr_cpuid, 1);
|
||||
|
||||
if (has_vector()) {
|
||||
if (riscv_v_setup_vsize())
|
||||
elf_hwcap &= ~COMPAT_HWCAP_ISA_V;
|
||||
}
|
||||
|
||||
riscv_user_isa_enable();
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user