免费注册 查看新帖 |

Chinaunix

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

[中断] 如何将tasklet_schedule()加入队列? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-29 10:13 |只看该作者 |倒序浏览
本帖最后由 testh 于 2013-07-29 10:13 编辑

在中断中调用了tasklet_schedule(),大部分情况下可以正常运行,但是会遇到这样一种情况:就是在中断中第n次调用了tasklet_schedule()之后去执行了对应的func,在func还未执行完之前,又产生了中断,这将会再次调用tasklet_schedule()去执行func。但是在tasklet_schedule()的代码中存在以下的代码:
  1. 542 static inline void tasklet_schedule(struct tasklet_struct *t)                                                                                 
  2. 543 {                                                                                                                                             
  3. 544   if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))                                                                                      
  4. 545     __tasklet_schedule(t);                                                                                                                    
  5. 546 }
复制代码
同时看注释也提醒到,如果在一次tasklet_handle未执行完之前又再次调用了它,便只会执行一次,也就是说第n+1次将不会被执行。
目前希望每次tasklet_handle都能够被执行,对于这个问题,请教大家是怎么处理的?

论坛徽章:
0
2 [报告]
发表于 2013-07-30 09:37 |只看该作者
回复 1# testh

> 目前希望每次tasklet_handle都能够被执行,对于这个问题,请教大家是怎么处理的?

这个以现在的设计肯定达不到你的要求。一般的做法都是在irq handler里把事件记下来(比如网卡的话收到的包queue到一个list里),再由tasklet handler统一处理。
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP