【请教】linux驱动注册后死锁
小陆zi 2014-07-09 09:13:58 大家好:
最近在开发一块omap的板子内核代码比较新。遇到一些问题请教一下大家:
我的中驱动中使用了devm_requestthreaded_irq()。我提交了中断处理函数。比如说 xxx_irq
xxx_irq()
{
int a = read_reg();
if(!a)
return IRQ_NONE;
if(a == 1)
input();
if(a == 2)
input()
rerurn IRQ_HANDLED;
}
在这个函数之中其实调用了request_threaded_irq()函数最终调用了__setup_irq()
在__setup_irq中起了一个线程irq_thread,这个线程对应的是调用了我驱动中写的xxx_irq函数。
在irq_thread中有这么两个函数:
handler_fn = irq_forced_thread_fn;
handler_fn = irq_thread_fn;
当我使用第一个force的函数时候,会死锁。开机后37秒内串口没有任何打印,最后打印信息是 no body care 在函数note_interrupt()中有相关信息。但是我调用irq_thread_fn不会死锁。调用devm_requestthreaded_irq()函数时我传递的是IRQF_IRQPOLL参数。
对比
handler_fn = irq_forced_thread_fn;
handler_fn = irq_thread_fn;
连个函数其实就是有一处不一样:local_bh_disable
我的问题是为什么这个disable会引起死锁或者是串口没有打印?
谢谢了