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

m silverstri michael.j.silverstri at gmail.com
Sat Feb 1 04:03:58 EST 2014


On Sat, Feb 1, 2014 at 12:48 AM, anish singh
<anish198519851985 at gmail.com> wrote:
> On Sat, Feb 1, 2014 at 12:32 AM, m silverstri
> <michael.j.silverstri at gmail.com> 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.



>>
>>
>> On Sat, Feb 1, 2014 at 12:06 AM, anish singh
>> <anish198519851985 at gmail.com> wrote:
>>> 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