<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">If you are talking about the same spin_lock, once it is locked, it is locked. Others (even from other CPUs) have to â€˜spin' util the lock is freed.<br class=""><div apple-content-edited="true" class="">
<div class=""><br class=""></div><div class="">-daveti</div><br class="Apple-interchange-newline">

</div>
<br class=""><div><blockquote type="cite" class=""><div class="">On Oct 24, 2014, at 11:04 PM, Oscar Salvador &lt;<a href="mailto:osalvador.vilardaga@gmail.com" class="">osalvador.vilardaga@gmail.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Hi!<br class=""><br class="">I have a doubt about interrupts and spin locks.<br class="">I'm not sure if I'm in the good way:<br class=""><br class="">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 class=""><br class="">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 class="">so if we have to lock the code we can do a spin_lock().<br class="">But with a spin_lock, even other CPU's can execute part of your code(code that is not part of the handler interrupt). <br class="">For example:<br class=""><br class="">(this is an example in a network device driver)<br class="">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 class=""><br class="">As far I could understand( I have read <a href="http://www.makelinux.net/ldd3/chp-5-sect-5" class="">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 class="">so I think that another cpu took the handler interrupt.<br class="">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.<br class="">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 class=""><br class="">Thank you very much<br class="">Oscar Salvador<br class=""></div>
_______________________________________________<br class="">Kernelnewbies mailing list<br class=""><a href="mailto:Kernelnewbies@kernelnewbies.org" class="">Kernelnewbies@kernelnewbies.org</a><br class="">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies<br class=""></div></blockquote></div><br class=""></body></html>