免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3008 | 回复: 5
打印 上一主题 下一主题

关于tasklet不可重入的一个疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-08 14:55 |只看该作者 |倒序浏览
近日学习内核中中断处理下半部的延时函数(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函数的执行具有串行
的特性?





论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
2 [报告]
发表于 2012-03-09 08:48 |只看该作者
回复 1# alexhak2004
我的问题是:可否把第3行的test_and_clear_bit放到第6行func的执行后,从而省掉第1/7/10
行对于tasklet_trylock/tasklet_unlock的调用?此时,也可以保证tasklet函数的执行具有串行
的特性?

这是不可以的。本身第三行的作用就不是用来检测的,而且不应该出现第三行的情况。
LZ应该看看TASKLET_STATE_SCHED和TASKLET_STATE_RUN这两个状态的区别

论坛徽章:
0
3 [报告]
发表于 2012-03-09 10:09 |只看该作者
谢谢版主的回答。我其实已经想到了你问的问题,但是可能我想的有问题,所以列出来请指教:

首先,对于if (!test_and_clear_bit(TASKLET_STATE_SCHED, &t->state))这句我的理解
这句话有两个作用:

1)判断TASKLET_STATE_SCHED是否设置,如果没有,则是一个错误,因为没有获取标志的tasklet不应该出现在list上;
2)清掉这个标记对应bit;

接下来,对于TASKLET_STATE_SCHED和TASKLET_STATE_RUN这两个标志的我的理解

1)TASKLET_STATE_SCHED表明一个tasklet加入到tasklet_vec->list的条件,只有取得
这个标志,才能把tasklet加到list上
2)TASKLET_STATE_RUN为了实现一个tasklet执行周期的“不可重入”

所以,如果一个tasklet已经被加入到一个list,而没有清掉TASKLET_STATE_SCHED,这个
tasklet是不可能被加入到另外一个list上去的,也就谈不上执行了。这也产生我在问题中提到的
把test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)挪后的想法。我认为这样也
能达到“不可重入”的目标。

不知道我的想法问题出在什么地方?请指教

论坛徽章:
0
4 [报告]
发表于 2012-03-09 11:03 |只看该作者
楼上的想法我认为达到”不可重入“是可以的,问题在于当一个tasklet对象正在一个CPU上被执行时,另一个CPU上如果发生同样的中断,相同的tasklet对象将无法提交到该cpu的链表中,换言之,当前的设计思想是最大程度保证一个tasklet正执行时,不会丢掉另一个可能的提交。

论坛徽章:
0
5 [报告]
发表于 2012-03-09 13:46 |只看该作者
同意您的意见,后面我想过,也是因为效率的问题。我是初学者,非常高兴能够得到指点。

论坛徽章:
0
6 [报告]
发表于 2012-03-09 13:47 |只看该作者
顶楼上~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP