Hi Peter, Thanks for your response. I think I didn't frame my question properly. I know how softirqs and tasklets work but what I don't is how do they function in queuing situations where the rate at which the softirq/tasklet is raised is faster than the rate at which they are scheduled/run. Thanks, -Joel On Mon, Oct 12, 2009 at 12:45 AM, Peter Teoh <htmldeveloper@xxxxxxxxx> wrote: > On Mon, Oct 12, 2009 at 12:24 PM, Joel Fernandes <agnel.joel@xxxxxxxxx> wrote: >> Hi Friends, >> >> I have a question about tasklets: >> >> I understand that they are used to defer work during interrupt >> handling. What I don't understand is - how do they handle queuing of >> deferred work? > > via softirq mechanism: look at kernel/softirq.c: > > 55 static struct softirq_action softirq_vec[NR_SOFTIRQS] > __cacheline_aligned_in_smp; > 56 > 57 static DEFINE_PER_CPU(struct task_struct *, ksoftirqd); > 58 > 59 char *softirq_to_name[NR_SOFTIRQS] = { > 60 "HI", "TIMER", "NET_TX", "NET_RX", "BLOCK", "BLOCK_IOPOLL", > 61 "TASKLET", "SCHED", "HRTIMER", "RCU" > 62 }; > > > From above, we can see that tasklet is just but one of the softirq > (software interrupt) todo list. Tasklet are implement by "HI" for > HI_SOFTIRQ (high priority tasklet) and TASKLET. To indicate a > software interrupt occurring u used raise_softirq() - then the action > will be executed later by softirqd (after wakeup_softirqd() is > called). > > The loop to go through each item on the tasklet todo list is here: > > 398 > 399 static void tasklet_action(struct softirq_action *a) > 400 { > 401 struct tasklet_struct *list; > 402 > 408 > 409 while (list) { > > 414 if (tasklet_trylock(t)) { > 415 if (!atomic_read(&t->count)) { > 416 if > (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) > 417 BUG(); > 418 t->func(t->data); > 419 tasklet_unlock(t); > 420 continue; > 421 } > 422 tasklet_unlock(t); > 423 } > >> Specially with tasklets, if a tasklet is re-scheduled before the >> previous scheduling of the same tasklet has a chance to run, then the >> tasklet is executed only once - not twice. But what if the work that >> the tasklet was supposed to do in these 2 instances were different and >> that its function was supposed to be passed 2 different structures? >> Shouldn't the tasklet be executed twice with these 2 structures? >> >> I know that work queues are there for that, but how do device drivers >> that use tasklets cope with the above? >> >> Thanks, >> -Joel > > > -- > Regards, > Peter Teoh > -- To unsubscribe from this list: send an email with "unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx Please read the FAQ at http://kernelnewbies.org/FAQ