Chinaunix
标题:
tasklet执行的疑问,求教解答
[打印本页]
作者:
dogygb
时间:
2008-11-07 14:37
标题:
tasklet执行的疑问,求教解答
在tasklet_action函数中有这么一段:
while (list) {
struct tasklet_struct *t = list;
list = list->next;
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);
}
local_irq_disable();
t->next = NULL;
*__get_cpu_var(tasklet_vec).tail = t;
__get_cpu_var(tasklet_vec).tail = &(t->next);
__raise_softirq_irqoff(TASKLET_SOFTIRQ);
local_irq_enable();
}
当count的值为1时候,就是说这个tasklet被禁用掉了,此tasklet还会被重新放回到队列末尾去,我的问题是既然已经被禁用掉了,为什么还要放到末尾去呢,这样不就使得循环一直不停的进行了吗?
作者:
dogygb
时间:
2008-11-07 20:14
兄弟们给点指导吧
作者:
biger410
时间:
2008-11-08 10:52
标题:
回复 #1 dogygb 的帖子
现在被禁掉了,以后可以在重新启用,启用的时候需要处理,所以要挂回链上。
循环不会一直进行的,因为相当于把这个禁用掉的tasklet跳过去了,然后继续遍历它的next,最终达到队尾的时候list为null,循环就结束了。
作者:
Kasulle
时间:
2008-11-08 12:01
每次执行的时候,per-cpu的tasklet链表头取出放在局部变量中,然后per-cpu的tasklet链表头被赋值为NULL。因此之后遍历是对这个局部变量的链表访问,而插入则在per-cpu的tasklet链表,两个不是同一个了。
在while()之前的语句:
254 list = __get_cpu_var(tasklet_vec).list; #遍历这个
255 __get_cpu_var(tasklet_vec).list = NULL; #插入这个
作者:
dogygb
时间:
2008-11-08 16:59
恩 楼上2位说得很对,确实是插入到原处理队列中了,而没有在临时变量所在队列,谢谢了
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2