我正在为自定义设备编写PCIe驱动程序/模块。由于该设备是可热插拔的,因此它可以随时消失。
这里我是如何设置 pci_driver 结构的:
struct pci_driver my_pci_driver = {
.name = "my_pci_driver",
.id_table = ids,
.probe = "my_pci_driver_probe",
.remove = "my_pci_driver_remove"
};
但我不知道如何正确处理remove事件。当调用 .remove 函数时,我有几个进程已经使用驱动程序打开并执行了几个ioctl。
那么处理删除设备的正确方法是什么?如何安全地等待当前正在运行的ioctl完成,然后从我的驱动程序中正确删除该设备?
答案 0 :(得分:0)
这是一个非常广泛的问题。您需要以支持设备删除的方式设计代码。您可以从任何usb驱动程序/ usr / src / linux / drivers / usb / ...中获取一个示例,它本质上是可移除的。
评论回复:
不,不是,USB子系统不负责驱动程序中的同步。
有很多方法可以同步引用计数,你可以使用互锁操作或使用自旋锁或......
在Windows上有一个很好的document描述同步原语,术语有点不同但概念是相同的,所以我建议。
答案 1 :(得分:0)
因为删除了硬件并不意味着您的驱动程序已被删除。所以你需要知道你的硬件是否存在。
然后你应该结束所有正在运行的事务。这意味着您在文件操作中执行的任何操作,它应该在某个时候结束并返回错误代码,您可以返回到用户代码。对于USB设备,有一个功能为您执行此操作。
用户空间代码可以在删除设备后执行读/写/ ioctl。这些系统调用知道硬件不再存在,因此它们应该返回错误代码。
然后,任何理智的应用程序都将退出或关闭相应的文件描述符。所以引用计数应该在开放/释放方法中进行。无论您分配了什么资源,它们在您的设备被删除后仍然可以存在。