riscv: Fix check_unaligned_access_all_cpus
authorAndrew Jones <ajones@ventanamicro.com>
Tue, 4 Mar 2025 12:00:18 +0000 (13:00 +0100)
committerAlexandre Ghiti <alexghiti@rivosinc.com>
Wed, 19 Mar 2025 14:23:29 +0000 (14:23 +0000)
check_vector_unaligned_access_emulated_all_cpus(), like its name
suggests, will return true when all cpus emulate unaligned vector
accesses. If the function returned false it may have been because
vector isn't supported at all (!has_vector()) or because at least
one cpu doesn't emulate unaligned vector accesses. Since false may
be returned for two cases, checking for it isn't sufficient when
attempting to determine if we should proceed with the vector speed
check. Move the !has_vector() functionality to
check_unaligned_access_all_cpus() in order for
check_vector_unaligned_access_emulated_all_cpus() to return false
for a single case.

Fixes: e7c9d66e313b ("RISC-V: Report vector unaligned access speed hwprobe")
Reviewed-by: Alexandre Ghiti <alexghiti@rivosinc.com>
Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
Link: https://lore.kernel.org/r/20250304120014.143628-13-ajones@ventanamicro.com
Signed-off-by: Alexandre Ghiti <alexghiti@rivosinc.com>
arch/riscv/kernel/traps_misaligned.c
arch/riscv/kernel/unaligned_access_speed.c

index aacbd9d..4354c87 100644 (file)
@@ -609,12 +609,6 @@ bool __init check_vector_unaligned_access_emulated_all_cpus(void)
 {
        int cpu;
 
-       if (!has_vector()) {
-               for_each_online_cpu(cpu)
-                       per_cpu(vector_misaligned_access, cpu) = RISCV_HWPROBE_MISALIGNED_VECTOR_UNSUPPORTED;
-               return false;
-       }
-
        schedule_on_each_cpu(check_vector_unaligned_access_emulated);
 
        for_each_online_cpu(cpu)
index 161964c..02b485d 100644 (file)
@@ -403,13 +403,16 @@ static int __init vec_check_unaligned_access_speed_all_cpus(void *unused __alway
 
 static int __init check_unaligned_access_all_cpus(void)
 {
-       bool all_cpus_emulated, all_cpus_vec_unsupported;
+       bool all_cpus_emulated;
+       int cpu;
 
        all_cpus_emulated = check_unaligned_access_emulated_all_cpus();
-       all_cpus_vec_unsupported = check_vector_unaligned_access_emulated_all_cpus();
 
-       if (!all_cpus_vec_unsupported &&
-           IS_ENABLED(CONFIG_RISCV_PROBE_VECTOR_UNALIGNED_ACCESS)) {
+       if (!has_vector()) {
+               for_each_online_cpu(cpu)
+                       per_cpu(vector_misaligned_access, cpu) = RISCV_HWPROBE_MISALIGNED_VECTOR_UNSUPPORTED;
+       } else if (!check_vector_unaligned_access_emulated_all_cpus() &&
+                  IS_ENABLED(CONFIG_RISCV_PROBE_VECTOR_UNALIGNED_ACCESS)) {
                kthread_run(vec_check_unaligned_access_speed_all_cpus,
                            NULL, "vec_check_unaligned_access_speed_all_cpus");
        }