void tasklet_init(struct tasklet_struct *t,void (*func)(unsigned long), unsigned long data)
用于初始化一个tasklet.
其源码分析如下:
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;
}
可以看到tasklet_init 主要就是给tasklet_struct 结构体的成员变量赋值为形参.
tasklet_kill 则用于清掉tasklet_struct成员变量的state的TASKLET_STATE_SCHED位。来禁止这个tasklet
被调度运行.
void tasklet_kill(struct tasklet_struct *t)
{
#tasklet_kill 可以被用于中断环境中,且如果是中断环境中则打印下面的log.
if (in_interrupt())
pr_notice("Attempt to kill tasklet from interrupt\n");
#返回state的值,state的值只能是
#enum
# {
# TASKLET_STATE_SCHED, /* Tasklet is scheduled for execution */
# TASKLET_STATE_RUN /* Tasklet is running (SMP only) */
# };
#也就是只能是0或者1.如果返回TASKLET_STATE_SCHED的话,也就是说这个tasklet没有
#被运行,这个while循环不成立。如果state的原来的状态就是TASKLET_STATE_RUN,则这个
#while 循环成立,进入到内循环中判断state是否被已经是TASKLET_STATE_SCHED,如果是的话,则退出
#内循环,这个时候外循环也就退出了
#
while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) {
do {
yield();
} while (test_bit(TASKLET_STATE_SCHED, &t->state));
}
#等待这个tasklet 被执行
tasklet_unlock_wait(t);
#清理tasklet中的TASKLET_STATE_SCHED 位
clear_bit(TASKLET_STATE_SCHED, &t->state);
}
中断API之tasklet_init/tasklet_kill
最新推荐文章于 2023-10-19 09:54:21 发布