Linus Torvalds wrote: > On Tue, 20 Mar 2007, Zachary Amsden wrote: > >> void local_irq_restore(int enabled) >> { >> pda.intr_mask = enabled; >> /* >> * note there is a window here where softirqs are not processed by >> * the interrupt handler, but that is not a problem, since it will >> * get done here in the outer enable of any nested pair. >> */ >> if (enabled) >> local_bh_enable(); >> } >> > > Actually, this one is more complicated. You also need to actually enable > hardware interrupts again if they got disabled by an interrupt actually > occurring while the "soft-interrupt" was disabled. > Actually, I was thinking the irq handlers would just not mess around with eflags on the stack, just call the chip to ack the interrupt and re-enable hardware interrupts when they left, since that is free anyway with the iret. Maybe leaving irqs disabled is better. > Anyway, it really *should* be pretty damn simple. No need to disable > preemption, there should be no events that can *cause* it, since all > interrupts get headed off at the pass.. (the return-from-interrupt thng > should already notice that it's returning to an interrupts-disabled > section and not try to do any preemption). > > What did I miss? > I wasn't disabling preemption to actually disable preemption. I was just using bh_disable as a global hammer to stop softirqs (thus the irq replay tasklet) from running during the normal irq_exit path. Then, we can just use the existing software IRQ replay code, and I think barely any new code (queue_irq(), etc) has to be written. Zach _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/virtualization