免费注册 查看新帖 |

Chinaunix

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

[内核模块] 如何使用避免内核定时器函数调用可休眠函数引发的系统崩溃问题? [复制链接]

论坛徽章:
1
辰龙
日期:2013-11-28 20:23:14
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-08 17:29 |只看该作者 |倒序浏览
  1. stm_enable()
  2. {
  3.         init_timer(timer);
  4.         timer->data = (unsigned long) data;
  5.         timer->function = timer_function;
  6.         timer->expires = jiffies + 1*HZ;
  7.         add_timer(timer);
  8. }

  9. /*省略其他相关细节*/
  10. timer_function()
  11. {
  12.         stm_one_step();//一步状态机操作,该操作函数会调用到休眠函数。。。

  13.         timer.expires = jiffies + 1*HZ;//每隔一秒执行一步状态机
  14.         add_timer(&timer);
  15. }
复制代码
在google查到说可以使用workqueue来避免这种情况.....
但是具体该如何操作呢?

把stm_one_step放在哪里执行?
哪位大侠给出一个大致框架也好啊!!!
我已试过将timer_function()或stm_one_step改为工作队列的执行函数,都会出错。。。。。。


论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
2 [报告]
发表于 2013-11-08 17:48 |只看该作者
回复 1# song0071000
  1. static DECLARE_WORK(my_work, stm_one_step);

  2. timer_function()
  3. {
  4.         schedule_work(&my_work);
  5.         ......
  6. }
复制代码
另外最好使用 mod_timer()而不是 add_timer()


   

论坛徽章:
1
辰龙
日期:2013-11-28 20:23:14
3 [报告]
发表于 2013-11-09 10:20 |只看该作者
  感谢回复。。该方法亲测还真可行!!!
不过想不明白,为什么我之前使用自己创建的workqueue来queue_work添加任务就不行呢,还引发系统崩溃?
而使用系统共享队列就没这个问题。求赐教!
asuka2001 发表于 2013-11-08 17:48
回复 1# song0071000 另外最好使用 mod_timer()而不是 add_timer()

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
4 [报告]
发表于 2013-11-11 09:09 |只看该作者
回复 3# song0071000

。。。不明白你怎么做的,请把源码贴下!
   

论坛徽章:
0
5 [报告]
发表于 2014-03-25 16:53 |只看该作者
song0071000 发表于 2013-11-08 17:29
在google查到说可以使用workqueue来避免这种情况.....
但是具体该如何操作呢?


看了一下timer的实现,是在bottom havles上实现的,所以不能再timer的callback里运行睡眠相关的函数吧。

tick_periodic --》 update_process_times --》 run_local_timers :
raise_softirq(TIMER_SOFTIRQ);

tick的handler里raise了TIMER_SOFTIRQ,所以在top havels退出的时候会去运行对应的下半部:run_timer_softirq
所以你的callback函数是在下半部的context上运行的,即在中断上下文,所以不能睡眠。

论坛徽章:
0
6 [报告]
发表于 2014-03-25 16:54 |只看该作者
asuka2001 发表于 2013-11-08 17:48
回复 1# song0071000 另外最好使用 mod_timer()而不是 add_timer()


大侠能解释一下为什么这时应该使用 mod_timer()而不是 add_timer() 吗?

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
7 [报告]
发表于 2014-03-26 09:36 |只看该作者
回复 6# studying_linux

直接摘录自 LKD3

Timer Race Conditions
Because timers run asynchronously with respect to the currently executing code, several
potential race conditions exist. First, never do the following as a substitute for a mere
mod_timer(), because this is unsafe on multiprocessing machines:
del_timer(my_timer)
my_timer->expires = jiffies + new_delay;
add_timer(my_timer);

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
8 [报告]
发表于 2014-03-26 09:39 |只看该作者
回复 7# asuka2001

现在 add_timer已经是使用 mod_timer作为实现了,不过如果 timer已经激活那会报告 BUG。

void add_timer(struct timer_list *timer)
{
         BUG_ON(timer_pending(timer));
         mod_timer(timer, timer->expires);
}
EXPORT_SYMBOL(add_timer);

论坛徽章:
0
9 [报告]
发表于 2014-03-26 11:25 |只看该作者
回复 7# asuka2001


Thanks. 我再细读一下这章
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP