]> git.dujemihanovic.xyz Git - linux.git/commitdiff
drivers: perf: Fix smp_processor_id() use in preemptible code
authorAlexandre Ghiti <alexghiti@rivosinc.com>
Mon, 26 Aug 2024 16:52:10 +0000 (18:52 +0200)
committerPalmer Dabbelt <palmer@rivosinc.com>
Wed, 11 Sep 2024 03:28:02 +0000 (20:28 -0700)
As reported in [1], the use of smp_processor_id() in
pmu_sbi_device_probe() must be protected by disabling the preemption, so
simple use get_cpu()/put_cpu() instead.

Reported-by: Nam Cao <namcao@linutronix.de>
Closes: https://lore.kernel.org/linux-riscv/20240820074925.ReMKUPP3@linutronix.de/ [1]
Signed-off-by: Alexandre Ghiti <alexghiti@rivosinc.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Tested-by: Nam Cao <namcao@linutronix.de>
Fixes: a8625217a054 ("drivers/perf: riscv: Implement SBI PMU snapshot function")
Reported-by: Andrea Parri <parri.andrea@gmail.com>
Tested-by: Andrea Parri <parri.andrea@gmail.com>
Link: https://lore.kernel.org/r/20240826165210.124696-1-alexghiti@rivosinc.com
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
drivers/perf/riscv_pmu_sbi.c

index 31a17a56eb3bba1b2d70e6443f37197ef3d78554..25b1b699b3e279cc19d8776865c3b466d39657ca 100644 (file)
@@ -1373,11 +1373,15 @@ static int pmu_sbi_device_probe(struct platform_device *pdev)
 
        /* SBI PMU Snapsphot is only available in SBI v2.0 */
        if (sbi_v2_available) {
+               int cpu;
+
                ret = pmu_sbi_snapshot_alloc(pmu);
                if (ret)
                        goto out_unregister;
 
-               ret = pmu_sbi_snapshot_setup(pmu, smp_processor_id());
+               cpu = get_cpu();
+
+               ret = pmu_sbi_snapshot_setup(pmu, cpu);
                if (ret) {
                        /* Snapshot is an optional feature. Continue if not available */
                        pmu_sbi_snapshot_free(pmu);
@@ -1391,6 +1395,7 @@ static int pmu_sbi_device_probe(struct platform_device *pdev)
                         */
                        static_branch_enable(&sbi_pmu_snapshot_available);
                }
+               put_cpu();
        }
 
        register_sysctl("kernel", sbi_pmu_sysctl_table);