Perf: Dont reset PMU's if perf is not active
Perf would save and restore counters after resetting the PMU when
the CPU's came out of power collapse even if a perf session wasn't
active. Check if perf was running before going into power collapse
and only then reset PMU's while coming out.
This way PMU's can be accessed externally via the RPM or T32 without
perf intruding in counter output.
Change-Id: I33ac11b2a5cae21456341fde015aabe5b4bb8f52
Signed-off-by: Ashwin Chaugule <ashwinc@codeaurora.org>
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c
index de314ea..88ad1a9 100644
--- a/arch/arm/kernel/perf_event.c
+++ b/arch/arm/kernel/perf_event.c
@@ -651,6 +651,26 @@
}
}
+static int cpu_has_active_perf(void)
+{
+ int idx;
+ struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
+
+ if (!armpmu)
+ return 0;
+
+ for (idx = 0; idx <= armpmu->num_events; ++idx) {
+ struct perf_event *event = cpuc->events[idx];
+
+ if (event)
+ /*Even one event's existence is good enough.*/
+ return 1;
+
+ }
+
+ return 0;
+}
+
static struct pmu pmu = {
.pmu_enable = armpmu_enable,
.pmu_disable = armpmu_disable,
@@ -676,16 +696,18 @@
{
switch (cmd) {
case CPU_PM_ENTER:
- armpmu_update_counters();
- perf_pmu_disable(&pmu);
+ if (cpu_has_active_perf()) {
+ armpmu_update_counters();
+ perf_pmu_disable(&pmu);
+ }
break;
case CPU_PM_ENTER_FAILED:
case CPU_PM_EXIT:
- if (armpmu && armpmu->reset)
+ if (cpu_has_active_perf() && armpmu->reset) {
armpmu->reset(NULL);
- perf_pmu_enable(&pmu);
-
+ perf_pmu_enable(&pmu);
+ }
break;
}