Commit 7ed98e01 authored by Mark Rutland's avatar Mark Rutland Committed by Will Deacon

drivers/perf: arm_pmu: manage interrupts per-cpu

When requesting or freeing interrupts, we use platform_get_irq() to find
relevant irqs, backing this up with additional information in an
optional irq_affinity table.

This means that our irq request and free paths are tied to a
platform_device, and our request path must jump through a number of
hoops in order to determine the required affinity of each interrupt.

Given that the affinity must be static, we can compute the affinity once
up-front at probe time, simplifying the irq request and free paths. By
recording interrupts in a per-cpu data structure, we simplify a few
paths, and permit a subsequent rework of the request and free paths.
Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
[will: rename local nr_irqs variable to avoid conflict with global]
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
parent 2681f018
This diff is collapsed.
...@@ -75,6 +75,8 @@ struct pmu_hw_events { ...@@ -75,6 +75,8 @@ struct pmu_hw_events {
* already have to allocate this struct per cpu. * already have to allocate this struct per cpu.
*/ */
struct arm_pmu *percpu_pmu; struct arm_pmu *percpu_pmu;
int irq;
}; };
enum armpmu_attr_groups { enum armpmu_attr_groups {
...@@ -88,7 +90,6 @@ struct arm_pmu { ...@@ -88,7 +90,6 @@ struct arm_pmu {
struct pmu pmu; struct pmu pmu;
cpumask_t active_irqs; cpumask_t active_irqs;
cpumask_t supported_cpus; cpumask_t supported_cpus;
int *irq_affinity;
char *name; char *name;
irqreturn_t (*handle_irq)(int irq_num, void *dev); irqreturn_t (*handle_irq)(int irq_num, void *dev);
void (*enable)(struct perf_event *event); void (*enable)(struct perf_event *event);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment