Question about using spinlock to synchronize between kernel driver and an interrupt handler

anish singh anish198519851985 at gmail.com
Sat Feb 1 03:06:55 EST 2014


On Fri, Jan 31, 2014 at 11:55 PM, m silverstri
<michael.j.silverstri at gmail.com> wrote:
> Hi,
>
> I read this article http://www.linuxjournal.com/article/5833 to learn
> about spinlock. I try this to use it in my kernel driver.
>
> Here is what my driver code needs to do:
> In f1(), it will get the spin lock, and caller can call f2() will wait
> for the lock since the spin lock is not being unlock. The spin lock
> will be unlock in my interrupt handler (triggered by the HW).
Wrong design!!!
>
> void f1() {
> spin_lock(&mylock);
> // write hardware
> REG_ADDR += FLAG_A;
So here you take spinlock and release in interrupt handler.What
if there is no interrupt handler and someone calls this fucntion
he will blocked forever.
>
> }
>
> void f2() {
> spin_lock(&mylock);
> //...
> }
>
> The hardware will send the application an interrupt and my interrupt
> handler will call spin_unlock(&mylock);
>
> My question is if I call
> f1()
> f2() // i want this to block until the interrupt return saying settingyou
> REG_ADDR is done.
>
> when I run this, I get an exception in kernel saying a deadlock "
> INFO: possible recursive locking detected"
>
> How  can I re-write my code so that kernel does not think I have a deadlock?
>
> I want my driver code to wait until HW sends me an interrupt saying
> setting REG_ADDR is done.
Let us know what is your requirement?I am sure there must be a simple
way to handle than this magic done here.
Explain what are you trying to do in detail and I am sure lot of
people will jump
to help.
>
> Thank you.
>
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies at kernelnewbies.org
> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies



More information about the Kernelnewbies mailing list