- 论坛徽章:
- 0
|
近日学习内核中中断处理下半部的延时函数(2.6.15)tasklet,产生了一点疑问,请教一下大家:
tasklet是base在softirq上的,所以它继承了softirq的特性,即在同一个CPU上,执行是串行的,
但是softirq对于不同的CPU还是有可能出现重入的情况。而tasklet则是由内核提供增强机制来实
现不可重入的,具体如下:
1.在tasklet_schedule中,
if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
__tasklet_schedule(t);
上面红色的代码保证了在不同的CPU上,tasklet t也只能出现在一个CPU的list上,直到
TASKLET_STATE_SCHED被清
2.在tasklet_action中,
1.if (tasklet_trylock(t)) {
2. if (!atomic_read(&t->count)) {
3. if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state))
4. BUG();
5. //from here, other CPUS can add tasklet to their lists
6. t->func(t->data);
7. tasklet_unlock(t);
8. continue;
9. }
10. tasklet_unlock(t);
11. }
上面,红色的代码保证了对于同一个tasklet,执行的串行性。从绿色的注释后,其他的
CPU也能够加入新的tasklet到list中。
我的问题是:可否把第3行的test_and_clear_bit放到第6行func的执行后,从而省掉第1/7/10
行对于tasklet_trylock/tasklet_unlock的调用?此时,也可以保证tasklet函数的执行具有串行
的特性?
|
|