| From a272a28f520c58a84853e098b4ee565486ca5062 Mon Sep 17 00:00:00 2001 |
| From: Stefan Bader <stefan.bader@canonical.com> |
| Date: Sat, 27 Sep 2008 11:07:30 -0400 |
| Subject: x86: Reserve FIRST_DEVICE_VECTOR in used_vectors bitmap. |
| |
| From: Stefan Bader <stefan.bader@canonical.com> |
| |
| Not in upstream above 2.6.27 due to change in the way this code works |
| (has been fixed differently there.) |
| |
| Someone from the community found out, that after repeatedly unloading |
| and loading a device driver that uses MSI IRQs, the system eventually |
| assigned the vector initially reserved for IRQ0 to the device driver. |
| |
| The reason for this is, that although IRQ0 is tied to the |
| FIRST_DEVICE_VECTOR when declaring the irq_vector table, the |
| corresponding bit in the used_vectors map is not set. So, if vectors are |
| released and assigned often enough, the vector will get assigned to |
| another interrupt. This happens more often with MSI interrupts as those |
| are exclusively using a vector. |
| |
| Fix this by setting the bit for the FIRST_DEVICE_VECTOR in the bitmap. |
| |
| Signed-off-by: Stefan Bader <stefan.bader@canonical.com> |
| Acked-by: Ingo Molnar <mingo@elte.hu> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/x86/kernel/io_apic_32.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| --- a/arch/x86/kernel/io_apic_32.c |
| +++ b/arch/x86/kernel/io_apic_32.c |
| @@ -2264,6 +2264,9 @@ void __init setup_IO_APIC(void) |
| for (i = FIRST_SYSTEM_VECTOR; i < NR_VECTORS; i++) |
| set_bit(i, used_vectors); |
| |
| + /* Mark FIRST_DEVICE_VECTOR which is assigned to IRQ0 as used. */ |
| + set_bit(FIRST_DEVICE_VECTOR, used_vectors); |
| + |
| enable_IO_APIC(); |
| |
| if (acpi_ioapic) |