- 论坛徽章:
- 0
|
楼上正解,state成员控制tasklet在每次schedule时,只能运行在一个CPU上;
如cpu0调用tasklet_schedule,tasklet被插入cpu0的tasklet链表,state成员被设置为TASKLET_STATE_SCHED,其它cpu再调用tasklet_schedule时,由于state已经设定为TASKLET_STATE_SCHED,将不会被插入其它cpu的tasklet链表;
当tasklet被调度时,TASKLET_STATE_SCHED状态将被清除,允许其它cpu调度,另外TASKLET_STATE_RUN状态用于多核同步:
if (tasklet_trylock(t)) {
if (!atomic_read(&t->count)) {
if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state))
BUG();
t->func(t->data);
tasklet_unlock(t);
continue;
}
tasklet_unlock(t);
}
count成员是和enable/disable tasklet相关的,count等于0,tasklet处于enable状态,count大于0,那么tasklet是disable状态;
|
|