On Tue, 21 Jan 2020 13:36:26 +0000 Thanos Makatos <thanos.maka...@nutanix.com> wrote:
> I'm passing through a virtual PCI device to a QEMU guest via VFIO/mdev and I > notice that MSI-X interrupts are disabled in the device (MSIXCAP.MXC.MXE is > zero) and the BARs containing the table and PBA (4 and 5 in my case) are never > accessed. However, whenever I fire an MSI-X interrupt from the virtual device > (although I'm not supposed to do so as they're disabled), the guest seems to > correctly receive it. I've started looking at hw/vfio/pci.c and it seems that > VFIO handles MSI-X interrupts there, including masking etc? Yes, the vector table and PBA are emulated in QEMU, the latter lazily only when vectors are masked, iirc. The backing device vector table should never be directly accessed by the user (it can be, but you can just discard those accesses), MSI-X is configured via the VFIO_DEVICE_SET_IRQS ioctl, which configures the eventfd through which an mdev driver would trigger an MSI. When you say that you "fire and MSI-X interrupt from the virtual device" does this mean that you're signaling via one of these eventfds? It looks to me like emulating the MSI-X enable bit in the MSI-X capability is probably the responsibility of the mdev vendor driver. With vfio-pci the VFIO_DEVICE_SET_IRQS ioctl would enable MSI-X on the physical device and the MSI-X capability seen by the user would reflect that. Are you missing a bit of code that updates the mdev config space as part of the SET_IRQS ioctl? Thanks, Alex