goingstudy 发表于 2016-08-20 10:11

关于tasklet的问题

看了点代码,有点小问题struct tasklet_struct {
struct tasklet_struct *next;
unsigned long state;
atomic_t count;
....
}我的问题是state和count两个变量的作用是不是有点重复?
1. 在tasklet_schedule注册一个tasklet时,会检查TASKLET_STATE_SCHED,所以同一个tasklet只可能在一个CPU上注册一次,而且不能同时注册到不同的CPU 上。
2. 在tasklet_action中,

会检查t->state 和t->count 这样会不会重复,因为只要其中一个满足条件,就能保障同一个tasklet只在一个CPU上运行(因为注册的时候保证了只能注册到一个CPU 上而且是一次)

nswcfd 发表于 2016-08-22 17:55

两层含义:

SCHED是控制是否被注册。
count是控制是否enable/disable。

有可能出现被disable但是却还在cpu tasklet list里的情况?

chengxta 发表于 2016-08-22 22:29

楼上正解,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状态;
页: [1]
查看完整版本: 关于tasklet的问题