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