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
