summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/arm64/kernel/perf_debug.c1
-rw-r--r--drivers/perf/arm_pmu.c22
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)