我想睡一边拿着一个互斥体
我需要写入和读取以太网芯片的FIFO,并且我想使用DMA控制器。 所以我修改了一个现有的驱动程序,并在触发DMA传输后使用wait_event_interruptible使进程进入睡眠状态,并使用wake_up_interruptible通过ISR唤醒进程。 我的问题是,原来的驱动程序使用自旋锁来保护FIFO访问。 但众所周知,在控制螺旋锁的同时,我不应该睡觉。 所以我试着用互斥锁取代螺旋锁。 (因为我可能会在获取互斥锁的时候睡觉,在获得互斥锁之后,我会在DMA触发后再次入睡,被ISR唤醒,我会释放互斥锁,没问题!我仍然得到这个'原子BUG'的时间安排。 问题是:我需要睡觉,直到DMA完成,同时持有一个锁(用于FIFO读写)。 睡觉的时候拿着互斥体不行吗?
ADD:在我的例子中,读取接收FIFO的接收函数是NAPI轮询函数,它是softirq中的一个(中断屏蔽被重置,但仍然是中断上下文,tasklet也是中断上下文)。 为了读取FIFO,我使用DMA并启动睡眠,所以这是一个问题:在softirq期间睡眠。
在持有互斥体的情况下睡觉是可以的。
scheduling while atomic BUG
指的是在原子上下文中休眠。 可能是,你忘记解锁某个锁,或者你试图睡在中断处理程序中。