可以在中断处理程序中安全地使用Linux链接列表API吗?

时间:2013-05-20 03:01:50

标签: linux-device-driver interrupt

我正在使用Linux内核2.6.33为自定义硬件编写设备驱动程序。我需要使用DMA来传输数据到设备或从设备传输数据。对于输出DMA,我想我会使用Linked List API(struct list_head,list_add()等)跟踪几个输出缓冲区。

当设备完成DMA传输时,会引发中断。然后,中断处理程序将检索链接列表中要传输的项目,并将其从列表中删除。

我的问题是,这在中断处理程序中实际上是安全的吗?或者这个API中存在固有的竞争条件会导致它不安全吗?

Linux设备驱动程序中的小部分,第3版。没有提到这一点。 Essential Linux设备驱动程序中的部分更完整,但也没有触及此主题。

编辑: 由于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

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

1 个答案:

答案 0 :(得分:1)

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

相关问题