All, On Tue, May 19, 2009 at 3:33 AM, raz ben yehuda <[email protected]> wrote:
> > On Tue, 2009-05-19 at 00:49 +0700, Mulyadi Santosa wrote: > > On Tue, May 19, 2009 at 12:33 AM, Ole Loots <[email protected]> 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 > please fix me if i am wrong. > what spinlock_irqsave does is: > 1. saves current of local interrupts. > 2. disables local interrupts > 3. acquires a lock > any other context tries to to access the protected data will spin. else, > how would you protect the data in SMP ? Spinlock are meant to write SMP safe routines. On UP, using spinlock get compiled to disable/enable of kernel preemption. spinlock_t xxx_lock = SPIN_LOCK_UNLOCKED; unsigned long flags; spin_lock_irqsave(&xxx_lock, flags); /* Critical Section*/ spin_unlock_irqrestore(&xxx_lock, flags); Above code is always safe. It disable interrupts *locally* but the spinlock guarantee the global lock. > > > 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 [email protected] > > Please read the FAQ at http://kernelnewbies.org/FAQ > > > > > -- > To unsubscribe from this list: send an email with > "unsubscribe kernelnewbies" to [email protected] > Please read the FAQ at http://kernelnewbies.org/FAQ > >
