[Click] NotifierQueue on multi-threaded Click problem.

Eddie Kohler kohler at cs.ucla.edu
Wed Sep 5 16:50:33 EDT 2007


spin_lock_bh() actually increments the preemption count, causing in_softirq() 
to return true.

I forget what the problem is that we are trying to solve here.

Eddie


Joonwoo Park wrote:
> Ye, it was my fault.
> But I'm being stupid, I cannot understand why in_softirq() returns
> true with this fix.
> -
> diff --git a/elements/linuxmodule/todevice.cc b/elements/linuxmodule/todevice.cc
> index 8a694ce..4bab844 100644
> --- a/elements/linuxmodule/todevice.cc
> +++ b/elements/linuxmodule/todevice.cc
> @@ -286,6 +286,7 @@ ToDevice::run_task(Task *)
> 
>         _pulls++;
> 
> +     WARN_ON(in_softirq());          // in_softirq() returns true
>         Packet *p = input(0).pull();
>         if (!p)
>             break;
> -
> 
> And after below, It stops warning.
> -
> diff --git a/elements/linuxmodule/todevice.cc b/elements/linuxmodule/todevice.cc
> index 8a694ce..a0ce2ba 100644
> --- a/elements/linuxmodule/todevice.cc
> +++ b/elements/linuxmodule/todevice.cc
> @@ -286,7 +286,10 @@ ToDevice::run_task(Task *)
> 
>         _pulls++;
> 
> +     netif_tx_unlock_bh(_dev);
> +     WARN_ON(in_softirq());        // in_softirq() returns false
>         Packet *p = input(0).pull();
> +     netif_tx_lock_bh(_dev);
>         if (!p)
>             break;
> 
> -
> 
> Jason Park (Joonwoo Park)
> 
> 
> 2007/9/5, Eddie Kohler <kohler at cs.ucla.edu>:
>> ToDevice::run_task() is not run in softirq context, it is called from Click's
>> kernel thread like every other task.  ToDevice DOES call spin_trylock_bh
>> itself, however.
>>
>> Eddie
>>
>>
>> Joonwoo Park wrote:
>>> In addition about softirq.
>>>
>>>>> - "The spinlock_bh needed because of push and pull can be called
>>>>> concurrently from softirq." : What do you mean?  I may be being stupid,
>>>>> but I don't think ANY pushes and pulls should be called from softirq
>>>>> context.  What softirq context are you thinking of?  Click runs almost
>>>>> entirely in user context (i.e. the kernel threads), or at least it should.
>>> The ToDevice::run_task() is runs in sofrtirq context and it pulls packet.
>>> You may get warning WARN_ON(in_softirq()) at that function.
>>> Isn't it OK?
>>>
>>> Jason Park (Joonwoo Park)


More information about the click mailing list