我有一个内核列表,ISR(上半部分)和下半部分(在我的情况下为工作队列)均可访问。最初,我使用spin_lock_irqsave()/ spin_unlock_irqstore()来禁用ISR和下半部分的中断。
该程序运行正常,除了警告,因为我正在spin_lock_irqsave()/ spin_lock_irqstore()内部调用dma_alloc_coherent()。我检查过代码,看起来好像不应该在禁用中断时调用此函数...在工作队列中切换为使用spin_lock()但在ISR中保留spin_lock_irqsave()之后,警告消失了...
由于项目的限制,我必须在工作队列中使用spin_lock()。那么在妥协之后,该程序真的安全吗?
PS:我之前使用的是dma_alloc_coherent()的GFP_KERNEL,不确定是否使用GFP_ATOMIC是正确的标志?