diff options
-rw-r--r-- | arch/arm64/kernel/perf_debug.c | 1 | ||||
-rw-r--r-- | drivers/perf/arm_pmu.c | 22 |
2 files changed, 22 insertions, 1 deletions
diff --git a/arch/arm64/kernel/perf_debug.c b/arch/arm64/kernel/perf_debug.c index 4cda01393f39..afa6a756027d 100644 --- a/arch/arm64/kernel/perf_debug.c +++ b/arch/arm64/kernel/perf_debug.c @@ -26,6 +26,7 @@ static char *descriptions = " 1 Perf: arm64: Add L1 counters to tracepoints\n" " 5 Perf: arm64: add perf user-mode permissions\n" " 6 Perf: arm64: Add debugfs node to clear PMU\n" + " 7 Perf: arm64: Update PMU force reset\n" ; static ssize_t desc_read(struct file *fp, char __user *buf, diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c index 079ed4206d28..f0ad3b8b941c 100644 --- a/drivers/perf/arm_pmu.c +++ b/drivers/perf/arm_pmu.c @@ -928,12 +928,32 @@ out_free: } #ifdef CONFIG_PERF_EVENTS_RESET_PMU_DEBUGFS -static void reset_pmu_force(void) +static __ref void reset_pmu_force(void) { + int cpu, ret; + u32 save_online_mask = 0; + + for_each_possible_cpu(cpu) { + if (!cpu_online(cpu)) { + save_online_mask |= BIT(cpu); + ret = cpu_up(cpu); + if (ret) + pr_err("Failed to bring up CPU: %d, ret: %d\n", + cpu, ret); + } + } if (cpu_pmu && cpu_pmu->reset) on_each_cpu(cpu_pmu->reset, NULL, 1); if (cpu_pmu && cpu_pmu->plat_device) armpmu_release_hardware(cpu_pmu); + for_each_possible_cpu(cpu) { + if ((save_online_mask & BIT(cpu)) && cpu_online(cpu)) { + ret = cpu_down(cpu); + if (ret) + pr_err("Failed to bring down CPU: %d, ret: %d\n", + cpu, ret); + } + } } static int write_enabled_perfpmu_action(void *data, u64 val) |