aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/perf
diff options
context:
space:
mode:
authorMarc Zyngier <marc.zyngier@arm.com>2016-09-06 10:34:44 -0400
committerWill Deacon <will.deacon@arm.com>2016-09-06 13:26:33 -0400
commit282b87963556a971f9acbe3d430991b80480541a (patch)
tree011dc587ee908f008dfee238e7db628a5eb3d825 /drivers/perf
parent98ab10e9770e3ce9fbd263689644be9d81a06885 (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.c11
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);