我正在使用 Linux 内核 2.6.33 为自定义硬件编写设备驱动程序。我需要使用 DMA 在设备之间传输数据。对于输出 DMA,我想我会使用 Linked List API(struct list_head、list_add() 等)跟踪几个输出缓冲区。
当设备完成 DMA 传输时,它会引发中断。然后中断处理程序将检索链表中的项目以进行传输,并将其从链表中删除。
我的问题是,这在中断处理程序中实际上是安全的吗?或者这个 API 中是否存在使其不安全的固有竞争条件?
Linux 设备驱动程序,第 3 版中的一小部分。没有提到这一点。Essential Linux Device Drivers 中的部分更完整,但也没有涉及这个主题。
编辑:由于 list_empty_careful() 函数中列出的注释,我开始认为它很可能不像 msh 所暗示的那样没有竞争条件:
* NOTE: using list_empty_careful() without synchronization
* can only be safe if the only activity that can happen
* to the list entry is list_del_init(). Eg. it cannot be used
* if another CPU could re-list_add() it.
http://lxr.free-electrons.com/source/include/linux/list.h?v=2.6.33;a=powerpc#L202
请注意,我计划在进程上下文中添加到队列中,并在中断上下文中从队列中删除。您真的不需要围绕列表的功能进行同步吗?