Chinaunix

标题: 如何将tasklet_schedule()加入队列? [打印本页]

作者: testh    时间: 2013-07-29 10:13
标题: 如何将tasklet_schedule()加入队列?
本帖最后由 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都能够被执行,对于这个问题,请教大家是怎么处理的?
作者: eexplorer    时间: 2013-07-30 09:37
回复 1# testh

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

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




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2