Spinlocks and interrupts
From: Jeff Haran <hidden>
Date: 2011-11-10 00:03:26
-----Original Message----- From: kernelnewbies-bounces+jharan=bytemobile.com at kernelnewbies.org [mailto:kernelnewbies- bounces+jharan=bytemobile.com at kernelnewbies.org] On Behalf Of Kai Meyer Sent: Wednesday, November 09, 2011 3:12 PM To: kernelnewbies at kernelnewbies.org Subject: Re: Spinlocks and interrupts Ok, I need mutual exclusion on a data structure regardless of
interrupts
and core. It sounds like it can be done by using a spinlock and
disabling interrupts, but you mention that "spinlocks are intended to
provide mutual exclsion between interrupt context and non-interrupt
context." Should I be using a semaphore (mutex) instead?
Perhaps I could explain my problem with some code:
struct my_struct *get_data(spinlock_t *mylock, int ALLOC_DATA)
{
struct my_struct *mydata = NULL;
spin_lock(mylock);
if (test_bit(index, mybitmap))
mydata = retrieve_data();
if (!mydata && ALLOC_DATA) {
mydata = alloc_data();
set_bit(index, mybitmap);
}
spin_unlock(mylock);
return mydata;
}
I need to prevent retrieve_data from being called if the index bit is
set in mybitmap and alloc_data has not completed, so I use a bitmap to
indicate that alloc_data has completed. I also need to protect
alloc_data from being run multiple times, so I use the spin_lock to
ensure that test_bit (and possibly retrieve_data) is not run while
alloc_data is being run (because it runs while the bit is cleared).
-Kai MeyerYou probably want to lock with spin_lock_irqsave() and unlock with spin_unlock_irqrestore() if you are not sure about what contexts get_data() will be called in. There's plenty of examples of how to use these in the kernel sources. I note you are passing in the address of the spinlock itself. Be wary of deadly embraces where two threads acquire two locks in different order. Jeff Haran