我想在持有互斥量时睡觉

时间:2015-06-05 12:07:07

标签: linux linux-kernel locking linux-device-driver

我需要写入和读取以太网芯片的FIFO,为此我想使用DMA控制器。所以我修改了一个现有的驱动程序,并在触发DMA传输后使用wait_event_interruptible使进程进入休眠状态,并使用wake_up_interruptible使其被ISR唤醒。我的问题是原始驱动程序使用自旋锁来保护FIFO访问。但众所周知,在拿着旋锁时,我不应该睡觉。所以我尝试用互斥锁替换螺旋锁。 (因为,我可能会在获取互斥锁时睡觉,在获得互斥锁之后,我会在DMA触发后再次睡眠。我被ISR唤醒了,我会释放互斥锁。没问题!我想。)但我仍然可以在原子BUG'时进行调度。问题是:我需要进入睡眠状态,直到DMA完成,同时保持锁定(用于FIFO读写)。拿着互斥锁时是不是可以睡觉? ADD:在我的情况下,读取接收FIFO的接收函数是NAPI轮询函数,它是softirq之一(中断屏蔽被复位,但它仍然是它的中断上下文.tasklet也是中断上下文)。要读取FIFO我使用DMA并转到睡眠,所以这就是问题:在softirq期间睡觉。

1 个答案:

答案 0 :(得分:0)

拿着互斥锁可以睡觉。

scheduling while atomic BUG指的是在原子语境中睡觉。可能你忘记解锁一些锁,或者你试图在中断处理程序中睡觉。