D&C GLug - Home Page

[ Date Index ] [ Thread Index ] [ <= Previous by date / thread ] [ Next by date / thread => ]

Re: [LUG] Tasklets

 

On Monday 18 April 2005 17:34, Robin Cornelius wrote:
On Sunday 17 April 2005 22:59, John Daragon wrote:
Robin Cornelius wrote:


BIG Snip...

BIGGER SNIP..

So tasklet_schedule() *is* being called.  And I presume there's no other 
invocation of tasklet_disable() anywhere so that the disable count is 
zero at this stage...

Actually, what I'm trying to say is : "Is

(0 == adapter->rx_tasklet.count)

at this juncture ?"

tasklet_schedule just puts it on the head of the per-cpu tasklet list, 
so if it's called (which it seems to be from your direct call mod...) 
then this *must* work,



I've got it!

IMHO its a kernel bug, look at these line from softirq.c in the function 
tasklet action :-

       if (tasklet_trylock(t)) {
                       if (!atomic_read(&t->count)) {
                               if (!test_and_clear_bit(TASKLET_STATE_SCHED, 
&t->state))
                                       BUG();
                               t->func(t->data);
                               tasklet_unlock(t);
                               continue;
                       }
                       tasklet_unlock(t);
               }

right in the middle there is 
       if (!atomic_read(&t->count)) 

so if the count is non zero then the tasklets DO NOT RUN! and ksoftirqd 
deadlocks. If i call tasklet_enable() it DECREMENTS the count by 1 and 
tasklet_disable() INCREMENTS the count by one, therefor if you do a 
tasklet_enable() your count ends up at -1 which is no good.

Removing the enable line from my code allows the tasklets to run BUT now I 
don't have any enables to match disables so the count just gets bigger!, what 
a PITA.


-- 
Robin Cornelius
---------------------------------------------------
robin@xxxxxxxxxxxxxxxxxxxxx
http://www.cornelius.demon.co.uk
http://sourceforge.net/projects/rt2400
GPG Key ID: 0x729A79A23B7EE764
http://www.biglumber.com/x/web?qs=0x729A79A23B7EE764

Attachment: pgp00017.pgp
Description: PGP signature