<div dir="ltr">inline answers.<div class="gmail_extra"><br><div class="gmail_quote">On Fri, Oct 24, 2014 at 8:04 AM, Oscar Salvador <span dir="ltr">&lt;<a href="mailto:osalvador.vilardaga@gmail.com" target="_blank">osalvador.vilardaga@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi!<br><br>I have a doubt about interrupts and spin locks.<br>I&#39;m not sure if I&#39;m in the good way:<br><br>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.<br><br>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 ), <br>so if we have to lock the code we can do a spin_lock().<br>But with a spin_lock, even other CPU&#39;s can execute part of your code(code that is not part of the handler interrupt). <br>For example:<br><br>(this is an example in a network device driver)<br>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.<br><br>As far I could understand( I have read <a href="http://www.makelinux.net/ldd3/chp-5-sect-5" target="_blank">http://www.makelinux.net/ldd3/chp-5-sect-5</a> ), spin_lock_irqsave only disables the interrupts for the local cpu(where the code is executed), <br>so I think that another cpu took the handler interrupt.<br></div></blockquote><div>Yes this can happen and if you expect that the interrupt can come in other CPU then you should handle that as well.</div><div>Generally interrupts are disabled so you won&#39;t get any interrupt on other CPU if any cpu is currently handling the interrupt.</div><div>However your explained sceneraio happens for network packets and that is why kernel uses  softirq mechanism for network</div><div>packets. Read about softirq.</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">The problem is if I&#39;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&#39;m trying to keep safe.<br>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?<br></div></blockquote><div>Your question is not quite coherent. </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br>Thank you very much<span class="HOEnZb"><font color="#888888"><br>Oscar Salvador<br></font></span></div>
<br>_______________________________________________<br>
Kernelnewbies mailing list<br>
<a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>
<a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
<br></blockquote></div><br></div></div>