免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2034 | 回复: 4

tasklet执行的疑问,求教解答 [复制链接]

论坛徽章:
0
发表于 2008-11-07 14:37 |显示全部楼层
在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还会被重新放回到队列末尾去,我的问题是既然已经被禁用掉了,为什么还要放到末尾去呢,这样不就使得循环一直不停的进行了吗?

论坛徽章:
0
发表于 2008-11-07 20:14 |显示全部楼层
兄弟们给点指导吧

论坛徽章:
0
发表于 2008-11-08 10:52 |显示全部楼层

回复 #1 dogygb 的帖子

现在被禁掉了,以后可以在重新启用,启用的时候需要处理,所以要挂回链上。
循环不会一直进行的,因为相当于把这个禁用掉的tasklet跳过去了,然后继续遍历它的next,最终达到队尾的时候list为null,循环就结束了。

论坛徽章:
0
发表于 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;  #插入这个

论坛徽章:
0
发表于 2008-11-08 16:59 |显示全部楼层
恩 楼上2位说得很对,确实是插入到原处理队列中了,而没有在临时变量所在队列,谢谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP