一、struct tasklet_struct
每个tasklet_struct 结构代表tasklet链表中的一个独立的小任务。其定义如下:
struct tasklet_struct {
struct tasklet_struct *next; /* 指向链表中的下一个tasklet(任务)*/
unsigned long state; /* tasklet 的状态*/
atomic_t count; /* 引用计数 */
void (*func)(unsigned long data); /* tasklet处理函数 */
unsigned long data; /* 给tasklet处理函数的参数 */
};
原子计数count:对这个tasklet的引用计数值。NOTE!只有当count等于0时,
tasklet代码段才能执行,也即此时tasklet是被使能的;如果
count非零,则这个tasklet是被禁止的。任何想要执行一个
tasklet代码段的人都首先必须先检查其count成员是否为0。
state :定义了这个tasklet的当前状态。这一个32位的无符号长整数,
当前只使用了bit[1]和bit[0]两个状态位。其中,bit[1]
=1表示这个tasklet当前正在某个CPU上被执行,它仅对SMP
系统才有意义,其作用就是为了防止多个CPU同时执行一个
tasklet的情形出现;bit[0]=1表示这个tasklet已经被调度
去等待执行了。
对这两个状态位的宏定义如下所示(interrupt.h):
enum
{
TASKLET_STATE_SCHED, /* Tasklet is scheduled for execution */
TASKLET_STATE_RUN /* Tasklet is running (SMP only) */
};
二、tasklet_init
{
t->next = NULL;
t->state = 0;
atomic_set(&t->count, 0);
t->func = func;
t->data = data;
}
{
if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
__tasklet_schedule(t);
}