0

我正在为自定义 PCIe 设备编写 linux 内核设备驱动程序。用户空间应用程序映射到该设备并频繁访问其内存(读取和写入)。PCIe 设备由外部电源驱动,在运行期间可能会关闭。

每当设备重置时,我的用户应用程序的所有内存读取都会返回0xFFFFFFFF。我想尽快在内核驱动中检测到设备重置,所以我error_detected根据https://www.kernel.org/doc/html/latest/PCI/pci-error-recovery.html实现了一个回调函数。

static pci_ers_result_t mydevice_error_detected(struct pci_dev* dev, pci_channel_state_t state) {
   printk(KERN_ALERT "mydevice PCI error detected");
   return PCI_ERS_RESULT_DISCONNECT;
}

static struct pci_error_handlers mydevice_error_handlers = {
   .error_detected = mydevice_error_detected,
   .slot_reset = mydevice_slot_reset,
   .resume = mydevice_resume
};

static struct pci_driver mydevice_driver = {
   .name = "mydevice",
   .id_table = mydevice_ids,
   .probe = mydevice_probe,
   .remove = mydevice_remove,
   .suspend = mydevice_suspend,
   .resume = mydevice_resume,
   .err_handler = &mydevice_error_handlers
};

但是,mydevice_error_detected在设备重置期间永远不会调用,即使用户空间应用程序不断尝试不成功地读取设备内存(并获得0xFFFFFFFF结果)。

此外,lspci在 PCI 重新扫描后仍会列出该设备,即使它已关闭:

01:00.0 Unassigned class [ff00]: MyVendorId Device 5a00 (rev ff)

唯一的区别是rev ff当设备处于关闭状态时,“”出现在行尾。否则lspci返回

01:00.0 Unassigned class [ff00]: MyVendorId Device 5a00

我很确定设备已完全关闭,因为在重置期间无法访问配置空间。我希望内核在对设备的第一个内存读取请求失败/超时时调用错误检测回调。我的假设正确吗?

4

0 回答 0