本文共 1196 字,大约阅读时间需要 3 分钟。
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);}
转载地址:http://ogjmi.baihongyu.com/