我需要写和读从以太网芯片的FIFO,为此,我想使用DMA控制器。因此,我修改了一个现有的驱动程序,并在触发DMA传输后,使用wait_event_interruptible使进程休眠,并使用wake_up_interruptible使其被ISR唤醒。我的问题是,原来的驱动程序是使用自旋锁来保护FIFO访问。但是大家都知道,当我抱着旋转锁的时候,我不应该睡觉。所以我试着用互斥锁代替自旋锁。(因为,我可能在获取互斥对象时睡觉,在获得互斥锁之后,我将在DMA触发器之后再次睡眠。我被ISR吵醒了,我会释放那个互斥体。没问题!我想。)但我还是得到了这样的“排班而原子错误”。问题是:我需要睡觉,直到DMA完成,同时持有一个锁(用于FIFO读写)。抱着互斥物睡觉不可以吗?
添加:在我的例子中,读取接收FIFO的接收函数是NAPI轮询函数,它是一个软函数(中断掩码被重置,但仍然是中断上下文。tasklet也是中断上下文)。要读取FIFO,我使用DMA和goto睡眠,所以这就是问题所在:在软时睡觉。
发布于 2015-06-05 15:38:53
抱着互斥物睡觉是可以的。
scheduling while atomic BUG指的是在原子上下文中睡觉。可能,您忘记解锁了,或者您试图在中断处理程序中睡觉。
https://stackoverflow.com/questions/30666183
复制相似问题