代码之家  ›  专栏  ›  技术社区  ›  Didier Trosset

Linux设备驱动程序能否等待dma在设备移除()函数中终止?

  •  3
  • Didier Trosset  · 技术社区  · 15 年前

    我为PCI设备编写了一个Linux设备驱动程序。此设备执行DMA操作。当DMA操作运行时,程序崩溃时会出现问题。

    实际上,当撞击时, device_remove() 函数由系统调用(好像 close() 被称为)。此函数用于清除PCI设备使用的内存区域,正确释放分配的内存。我的意思是它在正常情况下正常工作。

    但是如果一个dma正在运行,当它实际终止时,它将无法执行dma清理,因为它不再能够访问已释放的设备数据。一个简单的解决方案是在close()函数中等待。 (这是我的理解,但可能DMA功能的最后一部分从未执行过?)

    是否建议让DMA在 DeFielsRevEnter() (阿卡 关闭() )设备驱动程序的功能?还有其他方法来处理这个问题吗?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Bandan    15 年前

    是的,等待应该有效,但是:

    除非您尝试测试PCI设备的意外删除行为,否则当您有DMA进入/离开设备时,调用remove()应该会失败。另外,我认为close()不能像remove()那样被处理。后者将从内存中完全删除所有与设备相关的数据结构(例如:请参阅其中一个网络设备驱动程序)。所以,换句话说,我想说的是:wait()on close(),fail()on remove()。

    另外,根据您的情况,您可能还想看看 reference counting 用于释放与设备相关的资源。