Re: Question regarding spinlock

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

 



On Tue, May 19, 2009 at 12:33 AM, Ole Loots <ole@xxxxxxxxxxxxx> wrote:
> Hello to the list,
>
> I got a question about spinlocks. Here is some pseudo-code:
>
> my_external_int_handler(...)
> {
>   spin_lock(&my_lock);
>   // do things...
>   spin_unlock(&my_lock);
> }
>
> my_ioctl_handler(ioctl_value)
> {
>   switch(ioctl_value)
>   {
>      case xy:
>            spin_lock_irqsave(&my_lock, flags);
>               // do stuff
>            spin_unlock_irqsave(&my_lock, flags);
>      break;
>   }
> }
>
> I just wan't to ensure that the interrupt is finished before I handle the
> IOCTL request, so that I'm not running into a race condition that would a
> affect an ring buffer.
> But what happens when an interrupt signal is triggered at the external
> interrupt pin, does spin_lock_irqsave que the interrupt? Or does it dismiss
> the interrupt? Does spinlock_irqsave mean I would miss an interrupt? If so,
> spinlock won't be the right thing to do...
>
> What I need is something like:
> while(interrupt_working){ sleep(); }
>
> How to do right?

i think spinlock_irqsave means it disables the interrupt pins
temporarily but not nullifying the queued interrupts. Once it is
enabled again, it would fire the handler again.

However, IIRC too, spin_lock_irqsave is disabling per CPU interrupt
line. So if you run your code in SMP or multicore, there is a chance
of both interrupt and ioctl handlers try to access the data. Although
it is expected, perhaps you could consider using per CPU data ?

regards,

Mulyadi.

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx
Please read the FAQ at 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