Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bd02d654 authored by Sheetal Sahasrabudhe's avatar Sheetal Sahasrabudhe Committed by Matt Wagantall
Browse files

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: default avatarSheetal Sahasrabudhe <sheetals@codeaurora.org>
parent 4e73e499
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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,
+21 −1
Original line number Diff line number Diff line
@@ -1581,12 +1581,32 @@ unsigned long perf_misc_flags(struct pt_regs *regs)
}

#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)