+ -
当前位置:首页 → 问答吧 → cheduling while atomic错误求助

cheduling while atomic错误求助

时间:2009-04-12

来源:互联网

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(),而这时有产生一个中端,会产生这样的问题?

作者: njkzkj   发布时间: 2009-04-12

痛苦了几天,算是整明白了
首先在底半部如果用tasklet的话是不允许睡眠的
很不幸,down是会睡眠的
可以采用的方法是代码优化,或者只采用workqueue(可以睡眠)
但要注意在workqueue里面睡眠的话,就要在Hard_interrupt/timer里面处理
一下唤醒的问题

作者: njkzkj   发布时间: 2009-04-17