[PATCH] x86_64: avoid wasting IRQs patch update

The patch adds boundary check for the MAX_GSI_NUM. Same as the update for
i386, the patch addresses a problem with ACPI SCI IRQ. The patch corrects
the code such that SCI IRQ is skipped and duplicate entry is avoided. The
VIA chipset uses 4-bit IRQ register for internal interrupt routing, and
therefore cannot handle IRQ numbers assigned to its devices. The patch
corrects this problem by allowing PCI IRQs below 16.

Signed-off-by: Natalie Protasevich <Natalie.Protasevich@unisys.com>
Acked-by: Andi Kleen <ak@muc.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by Natalie.Protasevich@unisys.com and committed by Linus Torvalds 6a1caa21 c70f5d66

+15 -2
+15 -2
arch/x86_64/kernel/mpparse.c
··· 970 * due to unused I/O APIC pins. 971 */ 972 int irq = gsi; 973 - gsi = pci_irq++; 974 - gsi_to_irq[irq] = gsi; 975 } 976 977 io_apic_set_pci_routing(ioapic, ioapic_pin, gsi,
··· 970 * due to unused I/O APIC pins. 971 */ 972 int irq = gsi; 973 + if (gsi < MAX_GSI_NUM) { 974 + if (gsi > 15) 975 + gsi = pci_irq++; 976 + #ifdef CONFIG_ACPI_BUS 977 + /* 978 + * Don't assign IRQ used by ACPI SCI 979 + */ 980 + if (gsi == acpi_fadt.sci_int) 981 + gsi = pci_irq++; 982 + #endif 983 + gsi_to_irq[irq] = gsi; 984 + } else { 985 + printk(KERN_ERR "GSI %u is too high\n", gsi); 986 + return gsi; 987 + } 988 } 989 990 io_apic_set_pci_routing(ioapic, ioapic_pin, gsi,