mirror of
https://github.com/torvalds/linux
synced 2024-09-29 16:00:27 +00:00
[PATCH] genirq: x86_64 irq: Reenable migrating irqs to other cpus
In the latest changes the code for migrating x86_64 irqs was dropped. This reads it in a fashion that will work even if we change the vector on level triggered irqs when we migrate them. [akpm@osdl.org: build fix] Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Rajesh Shah <rajesh.shah@intel.com> Cc: Andi Kleen <ak@muc.de> Cc: "Protasevich, Natalie" <Natalie.Protasevich@UNISYS.com> Cc: "Luck, Tony" <tony.luck@intel.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
e7b946e98a
commit
0be6652f1e
|
@ -1254,18 +1254,48 @@ static int ioapic_retrigger_vector(unsigned int vector)
|
||||||
* races.
|
* races.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void ack_apic(unsigned int vector)
|
static void ack_apic(unsigned int irq)
|
||||||
{
|
{
|
||||||
ack_APIC_irq();
|
ack_APIC_irq();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ack_apic_edge(unsigned int irq)
|
||||||
|
{
|
||||||
|
move_native_irq(irq);
|
||||||
|
ack_APIC_irq();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ack_apic_level(unsigned int irq)
|
||||||
|
{
|
||||||
|
int do_unmask_irq = 0;
|
||||||
|
|
||||||
|
#if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE)
|
||||||
|
/* If we are moving the irq we need to mask it */
|
||||||
|
if (unlikely(irq_desc[irq].status & IRQ_MOVE_PENDING)) {
|
||||||
|
do_unmask_irq = 1;
|
||||||
|
mask_IO_APIC_irq(irq);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We must acknowledge the irq before we move it or the acknowledge will
|
||||||
|
* not propogate properly.
|
||||||
|
*/
|
||||||
|
ack_APIC_irq();
|
||||||
|
|
||||||
|
/* Now we can move and renable the irq */
|
||||||
|
move_masked_irq(irq);
|
||||||
|
if (unlikely(do_unmask_irq))
|
||||||
|
unmask_IO_APIC_irq(irq);
|
||||||
|
}
|
||||||
|
|
||||||
static struct irq_chip ioapic_chip __read_mostly = {
|
static struct irq_chip ioapic_chip __read_mostly = {
|
||||||
.name = "IO-APIC",
|
.name = "IO-APIC",
|
||||||
.startup = startup_ioapic_vector,
|
.startup = startup_ioapic_vector,
|
||||||
.mask = mask_ioapic_vector,
|
.mask = mask_ioapic_vector,
|
||||||
.unmask = unmask_ioapic_vector,
|
.unmask = unmask_ioapic_vector,
|
||||||
.ack = ack_apic,
|
.ack = ack_apic_edge,
|
||||||
.eoi = ack_apic,
|
.eoi = ack_apic_level,
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
.set_affinity = set_ioapic_affinity_vector,
|
.set_affinity = set_ioapic_affinity_vector,
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue