Messages in this thread Patch in this message | | | Date | Tue, 8 Sep 2015 16:02:29 +0200 (CEST) | From | Thomas Gleixner <> | Subject | Re: Question related to patch: x86/irq: Remove x86_io_apic_ops.set_affinity and related interfaces |
| |
On Tue, 8 Sep 2015, Mika Westerberg wrote: > It says that there are no users for x86_io_apic_ops.set_affinity but then > it does this: > > - x86_io_apic_ops.set_affinity(idata, mask, false); > + irq_set_affinity(irq, mask); > > The difference is that x86_io_apic_ops.set_affinity() programs affinity > directly to the hardware (if I understand it right) but irq_set_affinity() > calls irqd_set_move_pending() which defers programming the hardware later. > > Now when an interrupt triggers we end up calling irq_move_masked_irq() with > unlocked descriptor. > > Without the above change we never do that and the crash does not happen.
Right. Patch below should fix that issue.
Thanks,
tglx
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 38a76f826530..d2ea50c5e936 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -2522,6 +2522,7 @@ void __init setup_ioapic_dest(void) int pin, ioapic, irq, irq_entry; const struct cpumask *mask; struct irq_data *idata; + struct irq_chip *chip; if (skip_ioapic_setup == 1) return; @@ -2545,9 +2546,9 @@ void __init setup_ioapic_dest(void) else mask = apic->target_cpus(); - irq_set_affinity(irq, mask); + chip = irq_data_get_chip(idata); + chip->irq_set_affinity(idata, mask, false); } - } #endif
| |