Thread (9 messages) 9 messages, 2 authors, 2013-12-04

[PATCH V6 2/2] arm64: perf: add support for percpu pmu interrupt

From: Vinayak Kale <hidden>
Date: 2013-12-04 06:26:30
Also in: lkml

On Tue, Dec 3, 2013 at 7:20 PM, Will Deacon [off-list ref] wrote:
On Mon, Dec 02, 2013 at 09:34:03AM +0000, Vinayak Kale wrote:
quoted
 static void
+armpmu_disable_percpu_irq(void *data)
+{
+     struct arm_pmu *armpmu = data;
+     struct platform_device *pmu_device = armpmu->plat_device;
+     int irq = platform_get_irq(pmu_device, 0);
+
+     cpumask_test_and_clear_cpu(smp_processor_id(), &armpmu->active_irqs);
Why not just cpumask_clear_cpu?
Yes, that would have serve the purpose. It was due to dumb copy/paste
from non-percpu counterpart.
quoted
+     disable_percpu_irq(irq);
+}
+
+static void
 armpmu_release_hardware(struct arm_pmu *armpmu)
 {
-     int i, irq, irqs;
+     int irq;
+     unsigned int i, irqs;
      struct platform_device *pmu_device = armpmu->plat_device;

      irqs = min(pmu_device->num_resources, num_possible_cpus());
+     if (!irqs)
+             return;

-     for (i = 0; i < irqs; ++i) {
-             if (!cpumask_test_and_clear_cpu(i, &armpmu->active_irqs))
-                     continue;
-             irq = platform_get_irq(pmu_device, i);
-             if (irq >= 0)
-                     free_irq(irq, armpmu);
+     irq = platform_get_irq(pmu_device, 0);
+     if (irq <= 0)
+             return;
+
+     if (irq_is_percpu(irq)) {
+             on_each_cpu(armpmu_disable_percpu_irq, armpmu, 1);
+             free_percpu_irq(irq, &cpu_hw_events);
+     } else {
+             for (i = 0; i < irqs; ++i) {
+                     if (!cpumask_test_and_clear_cpu(i, &armpmu->active_irqs))
+                             continue;
+                     irq = platform_get_irq(pmu_device, i);
+                     if (irq > 0)
+                             free_irq(irq, armpmu);
+             }
      }
 }

+static void
+armpmu_enable_percpu_irq(void *data)
+{
+     struct arm_pmu *armpmu = data;
+     struct platform_device *pmu_device = armpmu->plat_device;
+     int irq = platform_get_irq(pmu_device, 0);
+
+     enable_percpu_irq(irq, IRQ_TYPE_NONE);
+     cpumask_set_cpu(smp_processor_id(), &armpmu->active_irqs);
Hmm, wouldn't it make more sense to pass the irq in data, then deal with the
mask in the caller? (since the mask will *always* be updated by each CPU).

Similarly for the disable path.
Okay.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help