On 4/24/07, Christian Boon <c.boon@xxxxxxxxxxxxxxxxxxxx> wrote:
Rajat Jain wrote: > On 4/23/07, pradeep singh <2500.pradeep@xxxxxxxxx> wrote: >> On 4/23/07, Mukund JB. <mukundjb@xxxxxxxxxxxxxxxxxxxxx> wrote: >> > >> > > On 4/23/07, Guennadi Liakhovetski <gl@xxxxxxxxx> wrote: >> > > > On Mon, 23 Apr 2007, pradeep singh wrote: >> > > > >> > > > > On 4/23/07, Guennadi Liakhovetski <gl@xxxxxxxxx> wrote: >> > > > > > >> > > > > > This cannot be true. Lost interrupts are bad, and you'd get >> them >> > all >> > > the >> > > > > > time, so, nothing would work. >> > > > > Right.That clears a lot of doubts. >> > > > > But all the interrupts in the mean time are taken care by the >> PIC >> > only >> > > > > AFAIK.Am i right? The moment CPU is ready to accept the >> interrupts >> > > > > again on the line, the inetrrupts are served. >> > > > >> > > > Yes, as long as these are different interrupts. >> > > Means the interrupt disabled using local_irq_save() if received in >> > > this period of time will be kind of buffered by the PIC only and >> only >> > > will be delivered to the CPU the moment interrupt is enabled >> > > again.Right? I am a little confused.Can you please help? >> > >> > AFAIK When you disable using local_irq_save(), the PIC interrupt lines >> > going to the CPU will be copied to the flags variable and all >> interrupts >> > on that CPU will be disabled. >> Only the maskable interrupts i guess. >> > >> > When you again use restore call, the flags variables which was earlier >> > saved in call to local_irq_save() will be restored. >> Yes, agreed. >> > >> > > >> > > What would happen if the same interrupt which was disabled using >> > > local_irq_save() is recieved again before local_irq_restore()? >> > > It will be buffered at the PIC only, right? Or is it that it will be >> > > served?Just like any interrupt on other lines? >> > >> > Lets say you were trying to hold Interrupt 9, and even if you receive >> > any multiple interrupts before call to local_irq_restore(), the old >> > value saved at local_irq_save() call will only be restored. So, NO new >> > PIC vales will be reflected on the CPU after call to >> > local_irq_restore(). >> So you are saying they are lost??? >> > > > If you disable an interrupt across all CPUs using disable_irq(), then > the IRQ is disabled at the PCI level. And hence if the hardware tries > to generate > an interrupt while interrupts are disabled, the interrupt is lost > forever. > > But if you try local_irq_save(), interrupts are disabled only on the > local processor. And any interrupts that arrive will be routed to > other processors in the system. Hence they won't be missed. > > What remains is a scenario where local_irq_save() is used on a > uniprocessor machine. In such a case, AFAIK, the interrupt will be > buffered in PIC till the interrupts are enabled again at the CPU. > However, if the same IRQ is generated multiple times while the IRQ is > disabled on the CPU, only one instance is delivered to the processor > and the rest get lost. Ofcourse it isnt good to disable interrupts for a long time but when interrupts are disabled and in the mean time you get e.g. 4 (different) interrupts , then the first thing the processor has to do when interrupts are enabled again is handle all the interrupts? I am talking about an uni processor. Are u sure the interrupts aren't lost?
No. This is just my understanding ... I should have posted the disclaimer ;) I remember coming across the above somewhere, and I cannot locate it now. I can find some hint at http://www.linuxjournal.com/article/6946 Here is the relevent text: "Other interrupts can occur while interrupts are disabled, but the processor does not allow them until interrupts are re-enabled. If more than one interrupt is blocked, the processor allows them in priority order when it is ready for interrupt service." Thanks, Rajat -- To unsubscribe from this list: send an email with "unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx Please read the FAQ at http://kernelnewbies.org/FAQ