diff options
| author | Marc Zyngier <marc.zyngier@arm.com> | 2016-09-06 10:34:44 -0400 |
|---|---|---|
| committer | Will Deacon <will.deacon@arm.com> | 2016-09-06 13:26:33 -0400 |
| commit | 282b87963556a971f9acbe3d430991b80480541a (patch) | |
| tree | 011dc587ee908f008dfee238e7db628a5eb3d825 /drivers/perf | |
| parent | 98ab10e9770e3ce9fbd263689644be9d81a06885 (diff) | |
drivers/perf: arm_pmu: Always consider IRQ0 as an error
As declared by the chief penguin, and enforced by the NO_IRQ brigade,
IRQ0 doesn't exist, and is considered as an error (no irq).
Unfortunately, the arm_pmu driver still considers it as valid in
a large number of cases. Let's fix this.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'drivers/perf')
| -rw-r--r-- | drivers/perf/arm_pmu.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c index c494613c1909..193a68cc2af4 100644 --- a/drivers/perf/arm_pmu.c +++ b/drivers/perf/arm_pmu.c | |||
| @@ -602,7 +602,7 @@ static void cpu_pmu_free_irq(struct arm_pmu *cpu_pmu) | |||
| 602 | irqs = min(pmu_device->num_resources, num_possible_cpus()); | 602 | irqs = min(pmu_device->num_resources, num_possible_cpus()); |
| 603 | 603 | ||
| 604 | irq = platform_get_irq(pmu_device, 0); | 604 | irq = platform_get_irq(pmu_device, 0); |
| 605 | if (irq >= 0 && irq_is_percpu(irq)) { | 605 | if (irq > 0 && irq_is_percpu(irq)) { |
| 606 | on_each_cpu_mask(&cpu_pmu->supported_cpus, | 606 | on_each_cpu_mask(&cpu_pmu->supported_cpus, |
| 607 | cpu_pmu_disable_percpu_irq, &irq, 1); | 607 | cpu_pmu_disable_percpu_irq, &irq, 1); |
| 608 | free_percpu_irq(irq, &hw_events->percpu_pmu); | 608 | free_percpu_irq(irq, &hw_events->percpu_pmu); |
| @@ -616,7 +616,7 @@ static void cpu_pmu_free_irq(struct arm_pmu *cpu_pmu) | |||
| 616 | if (!cpumask_test_and_clear_cpu(cpu, &cpu_pmu->active_irqs)) | 616 | if (!cpumask_test_and_clear_cpu(cpu, &cpu_pmu->active_irqs)) |
| 617 | continue; | 617 | continue; |
| 618 | irq = platform_get_irq(pmu_device, i); | 618 | irq = platform_get_irq(pmu_device, i); |
| 619 | if (irq >= 0) | 619 | if (irq > 0) |
| 620 | free_irq(irq, per_cpu_ptr(&hw_events->percpu_pmu, cpu)); | 620 | free_irq(irq, per_cpu_ptr(&hw_events->percpu_pmu, cpu)); |
| 621 | } | 621 | } |
| 622 | } | 622 | } |
| @@ -638,7 +638,7 @@ static int cpu_pmu_request_irq(struct arm_pmu *cpu_pmu, irq_handler_t handler) | |||
| 638 | } | 638 | } |
| 639 | 639 | ||
| 640 | irq = platform_get_irq(pmu_device, 0); | 640 | irq = platform_get_irq(pmu_device, 0); |
| 641 | if (irq >= 0 && irq_is_percpu(irq)) { | 641 | if (irq > 0 && irq_is_percpu(irq)) { |
| 642 | err = request_percpu_irq(irq, handler, "arm-pmu", | 642 | err = request_percpu_irq(irq, handler, "arm-pmu", |
| 643 | &hw_events->percpu_pmu); | 643 | &hw_events->percpu_pmu); |
| 644 | if (err) { | 644 | if (err) { |
| @@ -919,7 +919,7 @@ static int of_pmu_irq_cfg(struct arm_pmu *pmu) | |||
| 919 | 919 | ||
| 920 | /* Check the IRQ type and prohibit a mix of PPIs and SPIs */ | 920 | /* Check the IRQ type and prohibit a mix of PPIs and SPIs */ |
| 921 | irq = platform_get_irq(pdev, i); | 921 | irq = platform_get_irq(pdev, i); |
| 922 | if (irq >= 0) { | 922 | if (irq > 0) { |
| 923 | bool spi = !irq_is_percpu(irq); | 923 | bool spi = !irq_is_percpu(irq); |
| 924 | 924 | ||
| 925 | if (i > 0 && spi != using_spi) { | 925 | if (i > 0 && spi != using_spi) { |
| @@ -969,8 +969,7 @@ static int of_pmu_irq_cfg(struct arm_pmu *pmu) | |||
| 969 | if (cpumask_weight(&pmu->supported_cpus) == 0) { | 969 | if (cpumask_weight(&pmu->supported_cpus) == 0) { |
| 970 | int irq = platform_get_irq(pdev, 0); | 970 | int irq = platform_get_irq(pdev, 0); |
| 971 | 971 | ||
| 972 | if (irq_is_percpu(irq)) { | 972 | if (irq > 0 && irq_is_percpu(irq)) { |
| 973 | /* If using PPIs, check the affinity of the partition */ | ||
| 974 | int ret; | 973 | int ret; |
| 975 | 974 | ||
| 976 | ret = irq_get_percpu_devid_partition(irq, &pmu->supported_cpus); | 975 | ret = irq_get_percpu_devid_partition(irq, &pmu->supported_cpus); |
