]> git.baikalelectronics.ru Git - kernel.git/commit
genirq/affinity: Make affinity setting if activated opt-in
authorThomas Gleixner <tglx@linutronix.de>
Fri, 24 Jul 2020 20:44:41 +0000 (22:44 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Mon, 27 Jul 2020 14:20:40 +0000 (16:20 +0200)
commit7d7836268a5d7b5ab0031c2b2e479ab2a6868576
treec0c90fdd493b07c736f04d5b8bfed90843e215e2
parent33d39de3b44d31836a6ea8075e80749568a1e3dd
genirq/affinity: Make affinity setting if activated opt-in

John reported that on a RK3288 system the perf per CPU interrupts are all
affine to CPU0 and provided the analysis:

 "It looks like what happens is that because the interrupts are not per-CPU
  in the hardware, armpmu_request_irq() calls irq_force_affinity() while
  the interrupt is deactivated and then request_irq() with IRQF_PERCPU |
  IRQF_NOBALANCING.

  Now when irq_startup() runs with IRQ_STARTUP_NORMAL, it calls
  irq_setup_affinity() which returns early because IRQF_PERCPU and
  IRQF_NOBALANCING are set, leaving the interrupt on its original CPU."

This was broken by the recent commit which blocked interrupt affinity
setting in hardware before activation of the interrupt. While this works in
general, it does not work for this particular case. As contrary to the
initial analysis not all interrupt chip drivers implement an activate
callback, the safe cure is to make the deferred interrupt affinity setting
at activation time opt-in.

Implement the necessary core logic and make the two irqchip implementations
for which this is required opt-in. In hindsight this would have been the
right thing to do, but ...

Fixes: 6ef6852af287 ("genirq/affinity: Handle affinity setting on inactive interrupts correctly")
Reported-by: John Keeping <john@metanate.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Marc Zyngier <maz@kernel.org>
Acked-by: Marc Zyngier <maz@kernel.org>
Cc: stable@vger.kernel.org
Link: https://lkml.kernel.org/r/87blk4tzgm.fsf@nanos.tec.linutronix.de
arch/x86/kernel/apic/vector.c
drivers/irqchip/irq-gic-v3-its.c
include/linux/irq.h
kernel/irq/manage.c