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

anish singh anish198519851985 at gmail.com
Sun Feb 2 03:07:49 EST 2014


On Sat, Feb 1, 2014 at 11:49 PM, m silverstri
<michael.j.silverstri at gmail.com> wrote:
> On Sat, Feb 1, 2014 at 5:34 AM, Josh Cartwright <joshc at eso.teric.us> wrote:
>> On Sat, Feb 01, 2014 at 01:32:49AM -0800, anish singh wrote:
>>> On Sat, Feb 1, 2014 at 1:15 AM, m silverstri
>>> <michael.j.silverstri at gmail.com> wrote:
>>> > 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
>>> ok so you are looking for below code:
>>>
>>>
>>> some_func()
>>> {
>>> set_register_value
>>> x_variable=0
>>> wait_for_event*(x_variable);
>>> }
>>>
>>> interrupt_handler(){
>>> x_variable=1
>>> wake_up();
>>> }
>>>
>>> request_irq(interrupt_handler);
>>
>> Please investigate the usage of completions in your driver.  See
>> include/linux/completion.h.  It sounds like it fits your usecase nicely.
>>
>>   Josh
>
> I have loooked at linux completion for my usecase
> So I think I can do
>
> DECLARE_COMPLETION(my_completion);
>
> some_func()
> {
> set_register_value
> wait_for_completion(my_completion);
> }
>
> interrupt_handler(){
> complete(my_completion);
> }
>
> request_irq(interrupt_handler);
>
>
> My question now is what if 1 kernel thread execute some_funct(), but
> before interrupt_handler() get invoked (from HW), another kernel
> thread executes some_func(). In essence, set_register_value is execute
> twice before interrupt_handler() return once.
>
> how can I prevent another kernel thread from executing
> "set_register_value()" when 1 is wait_for_completion?
Please implement your driver or whatever you are doing and if you
run into a wall then ask here as what you are asking is incoherent.



More information about the Kernelnewbies mailing list