Question about using spinlock to synchronize between kernel driver and an interrupt handler
anish singh
anish198519851985 at gmail.com
Sat Feb 1 03:48:00 EST 2014
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.
>
>
>
> 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