By driver code , I mean the code which set the register values and wait till the values is set (via an interrupt handler) before continues doing something else On Sat, Feb 1, 2014 at 1:06 AM, anish singh <anish198519851985@xxxxxxxxx> wrote: > On Sat, Feb 1, 2014 at 1:03 AM, m silverstri > <michael.j.silverstri@xxxxxxxxx> wrote: >> On Sat, Feb 1, 2014 at 12:48 AM, anish singh >> <anish198519851985@xxxxxxxxx> wrote: >>> On Sat, Feb 1, 2014 at 12:32 AM, m silverstri >>> <michael.j.silverstri@xxxxxxxxx> wrote: >>> don't top-post >>> >>>> In my driver code, >>>> I want to set a bit in a HW Register 1. HW will send an interrupt >>> Yes this is how most drivers work. >>> >>>> when setting the register is done. >>>> I don't want my driver code to block until the interrupt is sent from the HW. >>> so i suppose this is what you want to do. >>> >>> >>> write ->register->interrupt happens->disable register ->handle interrupt >>> --->enable register. >>> Look at any driver code from linux kernel code and it mostly does this. >>>> >> >> Thanks. >> But I want my driver code to block until I get the interrupt from HW. > > if (driver code == interrupt handler) { > it_is_not_running_anyway_as_there_is_no_interrupt > } else { > i don't know what you mean by driver code here? > } >> >> >> >>>> >>>> >>>> On Sat, Feb 1, 2014 at 12:06 AM, anish singh >>>> <anish198519851985@xxxxxxxxx> wrote: >>>>> 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