Re: spin_lock and interupts

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

 



Hi,

El Mon, Oct 27, 2008 at 04:44:17PM +0100 Leon Ljunggren ha dit:

> Hi,
> I working on a driver for a embedded system running Linux 2.6.20.3 and
> I'm having a bit of problem getting spin_lock to work as I'd expect it
> to.
> 
> The driver reads from an AVR and before it does that one need do a
> write to tell it were to read is to take place. The problem is that I
> have a interupt function that will also perform such a read and if it
> interupts the user induced read after i2c_write but before i2c_read it
> can cause the read to happen in the wrong place.
> 
> To ensure that  this doesn't happen I'm trying to use
> spin_lock_irqsave, but I'm getting rather unexpected results. First of
> all it doesn't seem to disable the interupt, the interupt function is
> still called and secondly it just seems to ignore the lock. Even if
> avr_read has aquired lock2 and then gets interupted (which it
> shouldn't since interupts should be disabled, right?) avr_interupt
> will not care and still call the write/read functions instead of
> blocking as expected.
> 
> Any pointers to what I might be doing wrong?
> 
> Thanks
> /Leon Ljunggren
> 
> ----- pseudo code ----
> 
> spinlock_t lock1 = SPIN_LOCK_UNLOCKED;
> spinlock_t lock2 = SPIN_LOCK_UNLOCKED;
> 
> i2c_read()
> {
>    spin_lock_irqsave(&lock1, lock1_flag);
>    ...
>    spin_unlock_irqrestore(&lock2, lock2_flag);
> }
> 
> i2c_write()
> {
>    spin_lock_irqsave(&lock1, lock1_flag);
>    ...
>    spin_unlock_irqrestore(&lock2, lock2_flag);
> }
> 
> 
> i2c_irq_read()
> {
>    spin_lock_irqsave(&lock1, lock1_flag);
>    ...
>    spin_unlock_irqrestore(&lock2, lock2_flag);
> }
> 
> i2c_irq_write()
> {
>    spin_lock_irqsave(&lock1, lock1_flag);
>    ...
>    spin_unlock_irqrestore(&lock2, lock2_flag);
> }

i there any special reason why you acquire lock1 but release lock2
('restoring' lock2_flags) in these functions? doesn't look good to me

-- 
Matthias Kaehlcke
Embedded Linux Engineer
Barcelona

              La posibilidad de realizar un suenyo es lo
                 que hace que la vida sea interesante
                                                                 .''`.
    using free software / Debian GNU/Linux | http://debian.org  : :'  :
                                                                `. `'`
gpg --keyserver pgp.mit.edu --recv-keys 47D8E5D4                  `-

--
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