Re: local_irq_save()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux