LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2140|回复: 2

cheduling while atomic错误求助

[复制链接]
发表于 2009-4-12 11:42:39 | 显示全部楼层 |阅读模式
BUG: scheduling while atomic: anybus_fake_db/0x00000201/343
Call Trace:

程序大致如下:
static irqreturn_t XXXX_irq_handler(int irq, void *dev_id)
{
  tasklet_schedule(&XXX_tasklet);
}
在TASKLET中
static void anybus_irq_tasklet(unsigned long param)
2580 {
...
   XXX_core_dpram_read();
....
  }
}



static int XXX_core_dpram_read(int node, long address, void *buf,
     size_t size)
{

  FPRINTK_2("ANYBUS %d : Wait until device is readable.\n",node);
   read_lock_bh(&anybus_core_devp[node].lock_anybus_free);
/* get the possession of the specific area */
DPRINTK_3("End wait of device read_lock_bh\n");
ret = anybus_core_dpram_apply(node, address, ret_size);
/* function error. in current version, only over area
    * error is taken. */
}

会不会是在tasklet中用read_lock_bh(),而这时有产生一个中端,会产生这样的问题?
 楼主| 发表于 2009-4-17 17:13:16 | 显示全部楼层
痛苦了几天,算是整明白了
首先在底半部如果用tasklet的话是不允许睡眠的
很不幸,down是会睡眠的
可以采用的方法是代码优化,或者只采用workqueue(可以睡眠)
但要注意在workqueue里面睡眠的话,就要在Hard_interrupt/timer里面处理
一下唤醒的问题
回复 支持 反对

使用道具 举报

发表于 2010-9-3 11:17:05 | 显示全部楼层
不错不错,我正遇到这个问题,受教了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表