On Fri, Jan 31, 2014 at 11:55 PM, m silverstri <michael.j.silverstri@xxxxxxxxx> 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@xxxxxxxxxxxxxxxxx > http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies _______________________________________________ Kernelnewbies mailing list Kernelnewbies@xxxxxxxxxxxxxxxxx http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies