• B
    x86: don't allow nr_irqs > NR_IRQS · c78d0cf2
    Ben Hutchings 提交于
    Impact: fix boot hang on 32-bit systems with more than 224 IO-APIC pins
    
    On some 32-bit systems with a lot of IO-APICs probe_nr_irqs() can
    return a value larger than NR_IRQS. This will lead to probe_irq_on()
    overrunning the irq_desc array.
    
    I hit this when running net-next-2.6 (close to 2.6.28-rc3) on a
    Supermicro dual Xeon system.  NR_IRQS is 224 but probe_nr_irqs() detects
    5 IOAPICs and returns 240.  Here are the log messages:
    
    Tue Nov  4 16:53:47 2008 ACPI: IOAPIC (id[0x01] address[0xfec00000] gsi_base[0])
    Tue Nov  4 16:53:47 2008 IOAPIC[0]: apic_id 1, version 32, address 0xfec00000, GSI 0-23
    Tue Nov  4 16:53:47 2008 ACPI: IOAPIC (id[0x02] address[0xfec81000] gsi_base[24])
    Tue Nov  4 16:53:47 2008 IOAPIC[1]: apic_id 2, version 32, address 0xfec81000, GSI 24-47
    Tue Nov  4 16:53:47 2008 ACPI: IOAPIC (id[0x03] address[0xfec81400] gsi_base[48])
    Tue Nov  4 16:53:47 2008 IOAPIC[2]: apic_id 3, version 32, address 0xfec81400, GSI 48-71
    Tue Nov  4 16:53:47 2008 ACPI: IOAPIC (id[0x04] address[0xfec82000] gsi_base[72])
    Tue Nov  4 16:53:47 2008 IOAPIC[3]: apic_id 4, version 32, address 0xfec82000, GSI 72-95
    Tue Nov  4 16:53:47 2008 ACPI: IOAPIC (id[0x05] address[0xfec82400] gsi_base[96])
    Tue Nov  4 16:53:47 2008 IOAPIC[4]: apic_id 5, version 32, address 0xfec82400, GSI 96-119
    Tue Nov  4 16:53:47 2008 ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 high edge)
    Tue Nov  4 16:53:47 2008 ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
    Tue Nov  4 16:53:47 2008 Enabling APIC mode:  Flat.  Using 5 I/O APICs
    Signed-off-by: NBen Hutchings <bhutchings@solarflare.com>
    Acked-by: NYinghai Lu <yhlu.kernel@gmail.com>
    Signed-off-by: NIngo Molnar <mingo@elte.hu>
    c78d0cf2
io_apic.c 92.5 KB