Unverified Commit 2840dadf authored by Alexandre Ghiti's avatar Alexandre Ghiti Committed by Palmer Dabbelt
Browse files

drivers: perf: Fix smp_processor_id() use in preemptible code



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: default avatarNam Cao <namcao@linutronix.de>
Closes: https://lore.kernel.org/linux-riscv/20240820074925.ReMKUPP3@linutronix.de/

 [1]
Signed-off-by: default avatarAlexandre Ghiti <alexghiti@rivosinc.com>
Reviewed-by: default avatarAnup Patel <anup@brainfault.org>
Tested-by: default avatarNam Cao <namcao@linutronix.de>
Fixes: a8625217 ("drivers/perf: riscv: Implement SBI PMU snapshot function")
Reported-by: default avatarAndrea Parri <parri.andrea@gmail.com>
Tested-by: default avatarAndrea Parri <parri.andrea@gmail.com>
Link: https://lore.kernel.org/r/20240826165210.124696-1-alexghiti@rivosinc.com


Signed-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
parent 1ff95eb2
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -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);