免费注册 查看新帖 |

Chinaunix

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

内核定时处理问题 [复制链接]

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

我写个模块  想定时的去执行事件, 但是dequeue事件是打开管道,不知道什么原因总是BUG: scheduling while atomic: xxxxxxxx;    这样的崩溃信息。
加了NONBLOCK还是不行。
  1. int dequeue(void)
  2. {
  3.         while(queue_head.next != NULL)
  4.         {
  5.                 struct queue_nod *tmp;
  6.                 mm_segment_t old_fs;
  7.                 printk("dequeue 1111\n");
  8.                 struct file *fp = filp_open("/fifo_dir", O_WRONLY|O_NONBLOCK, 0644);
  9.                 if(IS_ERR(fp))
  10.                 {
  11.                         printk("open file failed\n");
  12.                         return -1;
  13.                 }
  14.                 old_fs = get_fs();
  15.                 set_fs(get_ds());
  16.                 printk("dequeue 2222\n");
  17.                 if(vfs_write(fp, queue_head.next->data, 100,&fp->f_pos) > 0)
  18.                 {

  19.                         printk("dequeue 3333\n");
  20.                         tmp = queue_head.next;
  21.                         queue_head.next = queue_head.next->next;
  22.                         queue_head.next->before = &queue_head;
  23.                         kfree(tmp);
  24.                 }
  25.                 filp_close(fp,NULL);
  26.                 set_fs(old_fs);
  27.         }
  28.         return 0;
  29. }
  30. struct timer_list mytimer;
  31. static void myfunc(unsigned long data)
  32. {
  33.         printk("%s/n", (char *)data);
  34.         dequeue();
  35.         mod_timer(&mytimer, jiffies + 2*HZ);
  36. }
  37. static int __init mytimer_init(void)
  38. {
  39.         setup_timer(&mytimer, myfunc, (unsigned long)"Hello, world!");
  40.         mytimer.expires = jiffies + HZ;
  41.         add_timer(&mytimer);
  42.         return 0;
  43. }
  44. static void __exit mytimer_exit(void)
  45. {
  46.         del_timer(&mytimer);
  47. }


  48. static int __init this_init(void)
  49. {
  50.         mytimer_init();
  51.          return ret;
  52. }
  53. static void __exit this_fini(void)
  54. {
  55.          mytimer_exit();
  56. }

  57. module_init(this_init);
  58. module_exit(this_fini);

复制代码

论坛徽章:
5
处女座
日期:2014-10-15 11:57:302015年亚洲杯之中国
日期:2015-03-04 17:05:552015亚冠之西悉尼流浪者
日期:2015-07-31 12:14:2915-16赛季CBA联赛之同曦
日期:2015-12-10 18:14:0615-16赛季CBA联赛之北京
日期:2016-07-07 17:01:53
2 [报告]
发表于 2012-02-29 17:13 |只看该作者
本帖最后由 zhanglin496 于 2012-02-29 17:25 编辑

在中断上下文中,不允许睡眠。

论坛徽章:
0
3 [报告]
发表于 2012-02-29 18:45 |只看该作者
NONBLOCK也不行么??

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2012-03-02 10:20 |只看该作者
或许你可以考虑工作队列

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2012-03-02 10:22 |只看该作者
回复 3# 1ming0


    要想弄清这个问题,你可以先把那句代码mask掉,看是什么情况

论坛徽章:
0
6 [报告]
发表于 2012-03-02 15:19 |只看该作者
del_timer改成del_timer_sync试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP