Skip to content
Advertisement

Scheduling multiple tasklets in linux

I am new to tasklets in Linux. Here I am scheduling 3 tasklets in ISR. But what I observed is that only one tasklet in executed.

fill_buf->data=jiffies;
tasklet_schedule(fill_buf);
fill_buf->data=jiffies;
tasklet_schedule(fill_buf);
fill_buf->data=jiffies;
tasklet_schedule(fill_buf);

fill_buf is tasklet_struct and Linux version is 5.10.63.

Advertisement

Answer

You are scheduling the same tasklet three times in a row, but a tasklet can only be scheduled again if it has already run (or it is currently running).

In fact, tasklet_schedule() checks the tasklet ->state and only schedules it if not already scheduled:

static inline void tasklet_schedule(struct tasklet_struct *t)
{
    if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
        __tasklet_schedule(t);
}

If you want to run the tasklet 3 times in a row, you can reschedule it from within itself:

struct my_tasklet_data {
    unsigned n_runs;
    u64 jiffies;
}

void fill_buf(unsigned long data)
{
    struct my_tasklet_data *td = (struct my_tasklet_data *)data;

    // Do what you need using td->jiffies ...

    // Reschedule for running if needed
    if (++td->n_runs < 3) {
        td->jiffies = get_jiffies_64();
        tasklet_schedule(fill_buf);
    }
}
/* Somewhere else in your code */

struct my_tasklet_data data = {
    .jiffies = get_jiffies_64(),
    .n_runs = 0
};

fill_buf->data = (unsigned long)&data;
tasklet_schedule(fill_buf);
User contributions licensed under: CC BY-SA
5 People found this is helpful
Advertisement