On 09/09/14 04:39, Will Deacon wrote:
> It's interesting that arm64 isn't affected by this problem, since we don't
> update the active_irqs mask for PPIs there and consequently just pass the
> irq instead of the cpu_pmu. I can't see why we actually need to update the
> active_irqs mask for arch/arm/, so could we remove that and follow arm64's
> lead instead? That would remove the need for a new struct definition too.
>

I guess you're saying that we don't need the active_irqs mask in the
percpu irq case? It looks like we still use it to determine when the
last CPU PMU has been disabled in the non-percpu case.

Here's the interdiff. Is there a reason arm64 casts data to an unsigned
int pointer when what's passed is an int pointer?

----8<-----

diff --git a/arch/arm/kernel/perf_event_cpu.c b/arch/arm/kernel/perf_event_cpu.c
index 1f24b47cd81e..4bf4cce759fe 100644
--- a/arch/arm/kernel/perf_event_cpu.c
+++ b/arch/arm/kernel/perf_event_cpu.c
@@ -74,28 +74,17 @@ static struct pmu_hw_events *cpu_pmu_get_cpu_events(void)
        return this_cpu_ptr(&cpu_hw_events);
 }
 
-struct pmu_enable {
-       struct arm_pmu *pmu;
-       int irq;
-};
-
 static void cpu_pmu_enable_percpu_irq(void *data)
 {
-       struct pmu_enable *pmu_enable = data;
-       struct arm_pmu *cpu_pmu = pmu_enable->pmu;
-       int irq = pmu_enable->irq;
+       int irq = *(int *)data;
 
        enable_percpu_irq(irq, IRQ_TYPE_NONE);
-       cpumask_set_cpu(smp_processor_id(), &cpu_pmu->active_irqs);
 }
 
 static void cpu_pmu_disable_percpu_irq(void *data)
 {
-       struct pmu_enable *pmu_enable = data;
-       struct arm_pmu *cpu_pmu = pmu_enable->pmu;
-       int irq = pmu_enable->irq;
+       int irq = *(int *)data;
 
-       cpumask_clear_cpu(smp_processor_id(), &cpu_pmu->active_irqs);
        disable_percpu_irq(irq);
 }
 
@@ -103,15 +92,12 @@ static void cpu_pmu_free_irq(struct arm_pmu *cpu_pmu)
 {
        int i, irq, irqs;
        struct platform_device *pmu_device = cpu_pmu->plat_device;
-       struct pmu_enable pmu_enable;
 
        irqs = min(pmu_device->num_resources, num_possible_cpus());
 
        irq = platform_get_irq(pmu_device, 0);
        if (irq >= 0 && irq_is_percpu(irq)) {
-               pmu_enable.pmu = cpu_pmu;
-               pmu_enable.irq = irq;
-               on_each_cpu(cpu_pmu_disable_percpu_irq, &pmu_enable, 1);
+               on_each_cpu(cpu_pmu_disable_percpu_irq, &irq, 1);
                free_percpu_irq(irq, &percpu_pmu);
        } else {
                for (i = 0; i < irqs; ++i) {
@@ -128,7 +114,6 @@ static int cpu_pmu_request_irq(struct arm_pmu *cpu_pmu, 
irq_handler_t handler)
 {
        int i, err, irq, irqs;
        struct platform_device *pmu_device = cpu_pmu->plat_device;
-       struct pmu_enable pmu_enable;
 
        if (!pmu_device)
                return -ENODEV;
@@ -147,9 +132,7 @@ static int cpu_pmu_request_irq(struct arm_pmu *cpu_pmu, 
irq_handler_t handler)
                                irq);
                        return err;
                }
-               pmu_enable.pmu = cpu_pmu;
-               pmu_enable.irq = irq;
-               on_each_cpu(cpu_pmu_enable_percpu_irq, &pmu_enable, 1);
+               on_each_cpu(cpu_pmu_enable_percpu_irq, &irq, 1);
        } else {
                for (i = 0; i < irqs; ++i) {
                        err = 0;


-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to