11 tasklet
1 tasklet调度机制
中断上半部执行完后,使能调度下半部;
中断下半部softirq_init中会调用asklet_action,在此函数中会去遍历链表检测符合条件的tasklet选出执行
2 常用API和数据结构
2.1 tasklet_struct
struct tasklet_struct
{
struct tasklet_struct *next;
unsigned long state; /* 调度的状态 */
atomic_t count; /* 此tasklet是否使能 */
void (*func)(unsigned long);
unsigned long data;
};
state : 表示tasklet的状态
bit0为tasklet是否放入了tasklet队列。(1为已经放入了tasklet队列)
bit1为此tasklet是否已经执行完毕。(0表示内核已经调度完成此小任务)
count : 表示task是否使能。0表示使能
2.2 tasklet_init
/**
* 初始化task_let,并使能
*/
void tasklet_init(struct tasklet_struct *t,
void (*func)(unsigned long), unsigned long data)
{
t->next = NULL;
t->state = 0;
atomic_set(&t->count, 0);
t->func = func;
t->data = data;
}
2.3 tasklet_enable、tasklet_disable
/**
* tasklet使能和禁止
*/
static inline void tasklet_enable(struct tasklet_struct *t);
static inline void tasklet_disable(struct tasklet_struct *t);
2.4 task_schedule
/**
* 开始taskletd的调度,将tasklet放入tasklet的队列
*/
static inline void tasklet_schedule(struct tasklet_struct *t);
2.5 tasklet_kill
/**
* 如何一个进程没有被调度(未被放入队列),择将它的调度状态变更为0
* 如果一个tasklet已经被调度(已经放入队列),择将会等其被执行后再将其调度状态清0
*/
void tasklet_kill(struct tasklet_struct *t);