2

我正在使用 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

请注意,我计划在进程上下文中添加到队列中,并在中断上下文中从队列中删除。您真的不需要围绕列表的功能进行同步吗?

4

1 回答 1

1

在中断上下文中使用内核链表是完全安全的,但是在中断处理程序中检索任何东西是一个坏主意。在中断处理程序中,您应该确认中断,安排“下半部分”并退出。所有处理都应该由“下半部分”完成(下半部分只是一个延迟工作——有几种合适的机制——小任务、工作队列等)。

于 2013-05-20T03:41:30.127 回答