2013-05-20 23 views
2

我正在为使用Linux内核2.6.33的自定义硬件写一个设备驱动程序。我需要使用DMA来传输数据和从设备传输数据。对于输出DMA,我想我会跟踪使用链接列表API(struct list_head,list_add()等)的几个输出缓冲区。Linux链接列表API可以在中断处理程序中安全使用吗?

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

我的问题是,这是一个安全的事情吗?或者在这个API中是否存在固有的竞争条件,会使其不安全?

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

编辑: 我开始认为它很可能不是竞争条件免费为MSH表明,由于list_empty_careful上市的说明()函数:

* 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

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

+0

缓冲区是预分配的,并在write()函数中填充并在链接列表中排队。我的中断处理程序要做的唯一事情就是释放前一个缓冲区,然后告诉硬件下一个DMA缓冲区在哪里并开始事务。你真的认为我需要这些简单交易的下半部分的开销吗? –

+0

我会说 - 是的,释放内存和与硬件通话会增加不可接受的延迟来中断处理程序。 – msh

+0

msh - 请参阅我的编辑,以了解您对上述答案的疑虑。 –

相关问题