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