Re: Spinlock query

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





2006/8/29, Rajat Jain <rajat.noida.india@xxxxxxxxx>:
On 8/30/06, Rik van Riel <riel@xxxxxxxxxxx> wrote:
> Rick Brown wrote:
> > Hi,
> >
> > In my driver (Process context), I have written the following code:
> >
> > --------------------------------------------
> > spin_lock(lock)
> > ...
> > //Critical section to manipulate driver data
>
> ... interrupt hits here
>     interrupt handler tries to grab the spinlock, which is already taken
>     *BOOM*
>
> > spin_u lock(lock)
> > ---------------------------------------------
> >

The interrupt handler TRIES to grab the spinlock, which is already
taken. Why will it "BOOM"? Wouldn't the interrupt handler busy wait,
waiting for the lock?
Am I missing something here?

Yes. You can read Documentation/spinlocks.txt. I am giving here a snippet:

The reasons you mustn't use these versions if you have
interrupts that play with the spinlock is that you can get
deadlocks:
        spin_lock(&lock);
        ...
                <- interrupt comes in:
                        spin_lock(&lock);

where an interrupt tries to lock an already locked variable. This is
ok if the other interrupt happens on another CPU, but it is _not_ ok
if the interrupt happens on the same CPU that already holds
the lock, because the lock will obviously never be released
(because the interrupt is waiting for the lock, and the lock-holder
is interrupted by the interrupt and will not continue until the interrupt
has been processed).

HTH,
-Manoj

Rajat

> > I have written similar code in my interrupt handler (Interrupt
> > context). The driver data is not accessed from anywhere else. Is my
> > code safe from any potential concurrency issues? Is there a need to
> > use spin_lock_irqsave()? In both the places?
>
> You need to use spin_lock_irqsave() from process context.
>  From the interrupt handler itself it doesn't hurt, but it
> shouldn't matter much since interrupt handlers should not
> get preempted.

--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive:       http://mail.nl.linux.org/kernelnewbies/
FAQ:           http://kernelnewbies.org/faq/



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux