Perf: arm64: Update PMU force reset
Bring all cores online before doing a force reset for PMU. This is required in order to handle corner case related to freeing of IRQs for offline cores. Change-Id: I091d9039e6554099ff4dd80d4a69cabe8eff3138 Signed-off-by: Sheetal Sahasrabudhe <sheetals@codeaurora.org> [satyap: trivial merge conflict resolution and move changes in arch/arm64/kernel/perf_event.c to drivers/perf/arm_pmu.c to align with kernel 4.4] Signed-off-by: Satya Durga Srinivasu Prabhala <satyap@codeaurora.org>
This commit is contained in:
parent
2c167c7786
commit
30fac71896
2 changed files with 22 additions and 1 deletions
|
@ -26,6 +26,7 @@ static char *descriptions =
|
||||||
" 1 Perf: arm64: Add L1 counters to tracepoints\n"
|
" 1 Perf: arm64: Add L1 counters to tracepoints\n"
|
||||||
" 5 Perf: arm64: add perf user-mode permissions\n"
|
" 5 Perf: arm64: add perf user-mode permissions\n"
|
||||||
" 6 Perf: arm64: Add debugfs node to clear PMU\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,
|
static ssize_t desc_read(struct file *fp, char __user *buf,
|
||||||
|
|
|
@ -928,12 +928,32 @@ out_free:
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PERF_EVENTS_RESET_PMU_DEBUGFS
|
#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)
|
if (cpu_pmu && cpu_pmu->reset)
|
||||||
on_each_cpu(cpu_pmu->reset, NULL, 1);
|
on_each_cpu(cpu_pmu->reset, NULL, 1);
|
||||||
if (cpu_pmu && cpu_pmu->plat_device)
|
if (cpu_pmu && cpu_pmu->plat_device)
|
||||||
armpmu_release_hardware(cpu_pmu);
|
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)
|
static int write_enabled_perfpmu_action(void *data, u64 val)
|
||||||
|
|
Loading…
Add table
Reference in a new issue