doubt about interrupts and spinlocks

anish singh anish198519851985 at gmail.com
Fri Oct 24 15:16:40 EDT 2014


inline answers.

On Fri, Oct 24, 2014 at 8:04 AM, Oscar Salvador <
osalvador.vilardaga at gmail.com> wrote:

> Hi!
>
> I have a doubt about interrupts and spin locks.
> I'm not sure if I'm in the good way:
>
> When an interrupt is raised, the kernel (through do_IRQ and etc)
> acknowledges the interrupt and locks this IRQ taking a spin lock, so any
> other cpu can not handle this interrupt, and then the kernel executes the
> handler, if there is a handler available for that interrupt.
>
> When we are on the handler interrupt , maybe we need to lock the cpu till
> we finish( if we are in a network driver, may we need to process some TX/RX
> packets ),
> so if we have to lock the code we can do a spin_lock().
> But with a spin_lock, even other CPU's can execute part of your code(code
> that is not part of the handler interrupt).
> For example:
>
> (this is an example in a network device driver)
> The system has to transmit a packet, so network subsystem calls
> ndo_start_xmit. Inside this function we take a lock disabling the
> interrupts(spin_lock_irqsave) because we have to do some private things,
> but suddenly an interrupt is raised and we go to the interrupt handler, we
> take a spin_lock, we do some work (processing some RX/TX packets), and
> exites from the interrupt handler, and then we come back to the
> ndo_start_xmit when we were.
>
> As far I could understand( I have read
> http://www.makelinux.net/ldd3/chp-5-sect-5 ), spin_lock_irqsave only
> disables the interrupts for the local cpu(where the code is executed),
> so I think that another cpu took the handler interrupt.
>
Yes this can happen and if you expect that the interrupt can come in other
CPU then you should handle that as well.
Generally interrupts are disabled so you won't get any interrupt on other
CPU if any cpu is currently handling the interrupt.
However your explained sceneraio happens for network packets and that is
why kernel uses  softirq mechanism for network
packets. Read about softirq.

> The problem is if I'm working with irq disabled, because I have to handle
> a private structure and suddenly interrupts is taking place, the interrupt
> can manipulate the code that I'm trying to keep safe.
> Is there any advice? Maybe that is happened because the code within my
> critical section on ndo_start_xmit has to be atomic? Otherwise it can go to
> sleep and I can lose my lock?
>
Your question is not quite coherent.

>
> Thank you very much
> Oscar Salvador
>
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies at kernelnewbies.org
> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20141024/e1bcb0a2/attachment.html 


More information about the Kernelnewbies mailing list