]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
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 aacbd9d7196e77d527f9f79916f14de6a6fe882c..4354c87c0376fd635017735645573fbb7f565fcf 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 161964cf2abce015638976ce9202a96469333c28..02b485dc4bc429c2835b10b977ad8866e92af8ba 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");
        }