Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6c2e9403 authored by Thomas Gleixner's avatar Thomas Gleixner Committed by Ingo Molnar
Browse files

x86: apic honour irq affinity which was set in early boot



setup_ioapic_dest() is called after the non boot cpus have been
brought up. It sets the irq affinity of all already configured
interrupts to all cpus and ignores affinity settings which were
done by the early bootup code.

If the IRQ_NO_BALANCING or IRQ_AFFINITY_SET flags are set then use the
affinity mask from the irq descriptor and not TARGET_CPUS.

Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 612e3684
Loading
Loading
Loading
Loading
+21 −5
Original line number Original line Diff line number Diff line
@@ -3761,7 +3761,9 @@ int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity)
void __init setup_ioapic_dest(void)
void __init setup_ioapic_dest(void)
{
{
	int pin, ioapic, irq, irq_entry;
	int pin, ioapic, irq, irq_entry;
	struct irq_desc *desc;
	struct irq_cfg *cfg;
	struct irq_cfg *cfg;
	cpumask_t mask;


	if (skip_ioapic_setup == 1)
	if (skip_ioapic_setup == 1)
		return;
		return;
@@ -3778,16 +3780,30 @@ void __init setup_ioapic_dest(void)
			 * cpu is online.
			 * cpu is online.
			 */
			 */
			cfg = irq_cfg(irq);
			cfg = irq_cfg(irq);
			if (!cfg->vector)
			if (!cfg->vector) {
				setup_IO_APIC_irq(ioapic, pin, irq,
				setup_IO_APIC_irq(ioapic, pin, irq,
						  irq_trigger(irq_entry),
						  irq_trigger(irq_entry),
						  irq_polarity(irq_entry));
						  irq_polarity(irq_entry));
				continue;

			}

			/*
			 * Honour affinities which have been set in early boot
			 */
			desc = irq_to_desc(irq);
			if (desc->status &
			    (IRQ_NO_BALANCING | IRQ_AFFINITY_SET))
				mask = desc->affinity;
			else
				mask = TARGET_CPUS;

#ifdef CONFIG_INTR_REMAP
#ifdef CONFIG_INTR_REMAP
			else if (intr_remapping_enabled)
			if (intr_remapping_enabled)
				set_ir_ioapic_affinity_irq(irq, TARGET_CPUS);
				set_ir_ioapic_affinity_irq(irq, mask);
#endif
			else
			else
				set_ioapic_affinity_irq(irq, TARGET_CPUS);
#endif
				set_ioapic_affinity_irq(irq, mask);
		}
		}


	}
	}