For hot-added IOAPICs, try to allocate irqs starting from ioapic->gsi_base first, and fallback to starting from 0. Signed-off-by: Jiang Liu <jiang.liu@xxxxxxxxxx> --- arch/x86/kernel/apic/io_apic.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index 622374f..e5b6ca4 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -294,13 +294,16 @@ static struct irq_cfg *realloc_irq_and_cfg_at(unsigned int at, int node) return alloc_irq_and_cfg_at(at, node); } -static int reserve_ioapic_gsi_irq_base(int idx) +static int reserve_ioapic_gsi_irq_base(int idx, bool hotadd) { int irq; struct mp_ioapic_gsi *gsi_cfg = mp_ioapic_gsi_routing(idx); int cnt = gsi_cfg->gsi_end - gsi_cfg->gsi_base + 1; irq = __irq_reserve_irqs(-1, gsi_cfg->gsi_base, cnt); + if (irq < 0 && hotadd) + irq = __irq_reserve_irqs(-1, 0, cnt); + if (irq >= 0) { gsi_cfg->irq_base = irq; printk(KERN_INFO @@ -378,7 +381,7 @@ int __init arch_early_irq_init(void) alloc_ioapic_saved_registers(i); for (i = 0; i < nr_ioapics; i++) - reserve_ioapic_gsi_irq_base(i); + reserve_ioapic_gsi_irq_base(i, false); reserve_ioapic_gsi_irq_extra(); @@ -4181,7 +4184,7 @@ int __mp_register_ioapic(int id, u32 address, u32 gsi_base, bool hotadd) if (gsi_cfg->gsi_end >= gsi_top) gsi_top = gsi_cfg->gsi_end + 1; } else { - int irq = reserve_ioapic_gsi_irq_base(idx); + int irq = reserve_ioapic_gsi_irq_base(idx, true); if (irq < 0) goto failed; -- 1.7.5.4 -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html