perf:arm64: fix lockdep warning when handling CPU_STARTING.
When hanlding CPU_STARTING event, cpu_pmu_notify() calls
platform_get_irq()->of_irq_get()->irq_find_matching_host()
->mutex_lock(). To avoid sleeping when handling CPU_STARTING
event, cache percpu_irq number in struct arm_pmu.
Bug: 32646661
Change-Id: I2c40013ab5cc7549e8ec1ab38eea493845a45c09
(cherry picked from commit 9b216b0e5a41419472a7fa8d39c0877ffe265c9a)
diff --git a/arch/arm64/include/asm/pmu.h b/arch/arm64/include/asm/pmu.h
index 497b52e..53d992a 100644
--- a/arch/arm64/include/asm/pmu.h
+++ b/arch/arm64/include/asm/pmu.h
@@ -44,6 +44,7 @@
struct arm_pmu {
struct pmu pmu;
bool percpu_irq_requested;
+ int percpu_irq;
cpumask_t active_irqs;
const char *name;
irqreturn_t (*handle_irq)(int irq_num, void *dev);
diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c
index 9a54f6a..a07d1f4 100644
--- a/arch/arm64/kernel/perf_event.c
+++ b/arch/arm64/kernel/perf_event.c
@@ -1045,6 +1045,7 @@
on_each_cpu(armpmu_enable_percpu_irq, &irq, 1);
cpu_pmu->percpu_irq_requested = true;
+ cpu_pmu->percpu_irq = irq;
} else {
for (i = 0; i < irqs; ++i) {
err = 0;
@@ -1342,7 +1343,7 @@
switch (action & ~CPU_TASKS_FROZEN) {
case CPU_DOWN_PREPARE:
if (pmu->percpu_irq_requested) {
- int irq = platform_get_irq(pmu->plat_device, 0);
+ int irq = pmu->percpu_irq;
smp_call_function_single(cpu,
armpmu_disable_percpu_irq, &irq, 1);
}
@@ -1353,7 +1354,7 @@
if (pmu->reset)
pmu->reset(pmu);
if (pmu->percpu_irq_requested) {
- int irq = platform_get_irq(pmu->plat_device, 0);
+ int irq = pmu->percpu_irq;
smp_call_function_single(cpu,
armpmu_enable_percpu_irq, &irq, 1);
}