Index: head-2006-04-24/arch/i386/kernel/io_apic-xen.c =================================================================== --- head-2006-04-24.orig/arch/i386/kernel/io_apic-xen.c 2006-04-25 12:14:36.000000000 +0200 +++ head-2006-04-24/arch/i386/kernel/io_apic-xen.c 2006-04-25 13:11:31.000000000 +0200 @@ -1207,7 +1207,7 @@ int assign_irq_vector(int irq) { physdev_op_t op; - BUG_ON(irq >= NR_IRQ_VECTORS); + BUG_ON(irq != AUTO_ASSIGN && (unsigned)irq >= NR_IRQ_VECTORS); if (irq != AUTO_ASSIGN && IO_APIC_VECTOR(irq) > 0) return IO_APIC_VECTOR(irq); @@ -1217,8 +1217,11 @@ int assign_irq_vector(int irq) return -ENOSPC; vector_irq[op.u.irq_op.vector] = irq; - if (irq != AUTO_ASSIGN) - IO_APIC_VECTOR(irq) = op.u.irq_op.vector; + if (irq != AUTO_ASSIGN) { + u8 vector = cmpxchg(&IO_APIC_VECTOR(irq), 0, op.u.irq_op.vector); + + BUG_ON(vector && vector != op.u.irq_op.vector); + } return op.u.irq_op.vector; } Index: head-2006-04-24/arch/x86_64/kernel/io_apic-xen.c =================================================================== --- head-2006-04-24.orig/arch/x86_64/kernel/io_apic-xen.c 2006-04-25 12:14:36.000000000 +0200 +++ head-2006-04-24/arch/x86_64/kernel/io_apic-xen.c 2006-04-25 13:11:31.000000000 +0200 @@ -881,14 +881,17 @@ int assign_irq_vector(int irq) return -ENOSPC; vector_irq[op.u.irq_op.vector] = irq; - if (irq != AUTO_ASSIGN) - IO_APIC_VECTOR(irq) = op.u.irq_op.vector; + if (irq != AUTO_ASSIGN) { + u8 vector = cmpxchg(&IO_APIC_VECTOR(irq), 0, op.u.irq_op.vector); + + BUG_ON(vector && vector != op.u.irq_op.vector); + } return op.u.irq_op.vector; } -extern void (*interrupt[NR_IRQS])(void); #ifndef CONFIG_XEN +extern void (*interrupt[NR_IRQS])(void); static struct hw_interrupt_type ioapic_level_type; static struct hw_interrupt_type ioapic_edge_type;