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.

-daveti


> On Oct 24, 2014, at 11:04 PM, Oscar Salvador <[email protected]> 
> 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 
> <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.
> 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?
> 
> Thank you very much
> Oscar Salvador
> _______________________________________________
> Kernelnewbies mailing list
> [email protected]
> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

_______________________________________________
Kernelnewbies mailing list
[email protected]
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

Reply via email to