linux-kernel - Linux 设备驱动程序能否在 device_remove() 函数中等待 DMA 终止?

标签 linux-kernel device-driver linux-device-driver dma pci

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

确实,当崩溃时,系统会调用device_remove() 函数(就像调用close() 一样)。此函数对 PCI 设备使用的内存区域进行清理,正确释放分配的内存。我的意思是它在正常情况下可以正常工作。

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

让 DMA 在设备驱动程序的 device_remove()(又名 close())函数中实际终止是个好主意吗?还有其他方法可以解决这个问题吗?

最佳答案

是的,等待应该可以,但是:

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

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

关于linux-kernel - Linux 设备驱动程序能否在 device_remove() 函数中等待 DMA 终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2817685/

相关文章:

c - 无法接收使用 NETLINK_ROUTE channel 从内核模块发送到用户应用程序的自定义消息

linux - 嵌入式linux中的Devicetree

linux - 应该如何调用 init_module (在用户空间中)

windows - 如何打包用于部署的 Windows 驱动程序?

C++11 原子 : does it make sense, 或者甚至可以将它们与内存映射 I/O 一起使用?

linux - 配置 LVDS 显示时序的问题(rk3288 上的 linux)

linux - 如何在内核模块 Makefile 中提供包含目录路径

linux - 我如何从内核空间中缩小 Linux 页面缓存?

linux - 几个/proc 和/dev 的问题

compiler-errors - 错误编译内核