Create device interrupt(MSI) failed with the function IOInterruptEventSource::interruptEventSource on macOS 12.0.1

Problem phenomenon: We have developed a third-party NVMe I/O kit driver for HighPoint NVMe Controller, which runs normally on macOS 11.x and previous version.

But the command timeout will often appear when testing on macOS 12.0.1 system.

Problem analysis: The Create Device Interrupt (MSI) function failed to return, and causing the command to time out.

The following is part of the code, NULL Pointer is returned: ies = IOInterruptEventSource::interruptEventSource (this, &RSNVMeController::interruptOccurred, PCIProvider,index );

Question: We would like to consult why Create Device Interrupt (MSI) failed and how to fix the issue???

Note: We suspect that the Inbox NVMe driver may create a device interrupt for the third-party NVMe device when the system is started, but sometimes it may not be released interrupt in time due to some reasons on macOS 12.0.1, causing other third-party NVMe drivers to fail to create an interrupt for the NVMe device. We tracked the difference between 11.6(OK) and 12.0.1(NG) regarding NVMe driver loading: macOS11.6: IONVMeFamily driver will Attach&Probe&Start for all NVMe devices(including Apple NVMe device and Third-Party NVMe device). macOS12.0.1: IONVMeFamily driver will Attach&Probe&Start for all NVMe devices(including Apple NVMe device and Third-Party NVMe device). If a third-party NVMe driver is found, IONVMeFamily driver will terminate and Detach from Third-Party NVMe device; IONVMeFamily driver will Attach&Probe&Detach for third-Party NVMe device. HighPoint Third-Party NVMe driver will Attach&Probe&Detach for Third-Party NVMe device.Select HighPoint Third-Party NVMe driver to Start, because its probe score is larger than IONVMeFamily driver. At present, it is suspected that the IONVMeFamily driver may attach/detach the third-party NVMe device multiple times in macOS 12.0.1, which will cause some interrupt resources to not be released in some cases. Of course this is just a guess…

STEPS TO REPRODUCE

  1. Insert 4 NVMe devices to HighPoint SSD7505 NVMe controller
  2. Plug SSD7505 to MacPro 2019
  3. Enter into macOS 12.0.1
  4. Install HighPoint NVMe driver
  5. Reboot OS
  6. Copy data to NVMe device
Create device interrupt(MSI) failed with the function IOInterruptEventSource::interruptEventSource on macOS 12.0.1
 
 
Q