Well, I've just tried this and I still get lost interrupts.
Just to make sure I've understood your instructions correctly, I've
appended do_ioapic_IRQ() from my source tree.
Also, when I rebooted I got a message about SMP IPI stuck in
invalidate or something like that. The message flashed on *just*
before the system rebooted.
Regards,
Richard....
static void do_ioapic_IRQ(unsigned int irq, int cpu, struct pt_regs * regs)
{
irq_desc_t *desc = irq_desc + irq;
spin_lock(&irq_controller_lock);
desc->ipi = 0;
/* If the irq is disabled for whatever reason, just set a flag and return */
if (desc->status & (IRQ_DISABLED | IRQ_INPROGRESS)) {
desc->events = 1;
spin_unlock(&irq_controller_lock);
return;
}
desc->status = IRQ_INPROGRESS;
desc->events = 0;
hardirq_enter(cpu);
spin_unlock(&irq_controller_lock);
while (test_bit(0,&global_irq_lock)) barrier();
for (;;) {
int pending;
/* If there is no IRQ handler, exit early, leaving the irq "in progress" */
if (!handle_IRQ_event(irq, regs))
goto no_handler;
spin_lock(&irq_controller_lock);
pending = desc->events;
desc->events = 0;
if (!pending)
break;
spin_unlock(&irq_controller_lock);
}
desc->status &= IRQ_DISABLED;
spin_unlock(&irq_controller_lock);
no_handler:
hardirq_exit(cpu);
release_irqlock(cpu);
/* Ack the irq inside the lock! */
ack_APIC_irq();
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu