summaryrefslogtreecommitdiffstats
path: root/drivers/perf/arm_pmu_platform.c
diff options
context:
space:
mode:
authorMark Rutland <mark.rutland@arm.com>2017-10-09 18:09:05 +0200
committerWill Deacon <will.deacon@arm.com>2018-02-20 12:34:54 +0100
commit167e61438da0664cab87c825a6c0cb83510d578e (patch)
tree3b05ff3a90e1c171d6aaa98d9bfa3ef33168c8a2 /drivers/perf/arm_pmu_platform.c
parentarm_pmu: note IRQs and PMUs per-cpu (diff)
downloadlinux-167e61438da0664cab87c825a6c0cb83510d578e.tar.xz
linux-167e61438da0664cab87c825a6c0cb83510d578e.zip
arm_pmu: acpi: request IRQs up-front
We can't request IRQs in atomic context, so for ACPI systems we'll have to request them up-front, and later associate them with CPUs. This patch reorganises the arm_pmu code to do so. As we no longer have the arm_pmu structure at probe time, a number of prototypes need to be adjusted, requiring changes to the common arm_pmu code and arm_pmu platform code. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Cc: Will Deacon <will.deacon@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'drivers/perf/arm_pmu_platform.c')
-rw-r--r--drivers/perf/arm_pmu_platform.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/perf/arm_pmu_platform.c b/drivers/perf/arm_pmu_platform.c
index 1dc3c1f574e0..7729eda5909d 100644
--- a/drivers/perf/arm_pmu_platform.c
+++ b/drivers/perf/arm_pmu_platform.c
@@ -159,10 +159,15 @@ static int pmu_parse_irqs(struct arm_pmu *pmu)
static int armpmu_request_irqs(struct arm_pmu *armpmu)
{
+ struct pmu_hw_events __percpu *hw_events = armpmu->hw_events;
int cpu, err;
for_each_cpu(cpu, &armpmu->supported_cpus) {
- err = armpmu_request_irq(armpmu, cpu);
+ int irq = per_cpu(hw_events->irq, cpu);
+ if (!irq)
+ continue;
+
+ err = armpmu_request_irq(irq, cpu);
if (err)
break;
}
@@ -173,9 +178,13 @@ static int armpmu_request_irqs(struct arm_pmu *armpmu)
static void armpmu_free_irqs(struct arm_pmu *armpmu)
{
int cpu;
+ struct pmu_hw_events __percpu *hw_events = armpmu->hw_events;
- for_each_cpu(cpu, &armpmu->supported_cpus)
- armpmu_free_irq(armpmu, cpu);
+ for_each_cpu(cpu, &armpmu->supported_cpus) {
+ int irq = per_cpu(hw_events->irq, cpu);
+
+ armpmu_free_irq(irq, cpu);
+ }
}
int arm_pmu_device_probe(struct platform_device *pdev,