Re: how do tasklets queue?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux