[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: question about handling MSI-X by VFIO
From: |
Thanos Makatos |
Subject: |
RE: question about handling MSI-X by VFIO |
Date: |
Thu, 23 Jan 2020 15:01:28 +0000 |
> > 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,
Indeed I fire interrupts via the eventfd and it works correctly. I just
couldn't understand how it could possibly work since the table and PBA BARs
were never accessed and the MSI-X enable bit was not set. It makes perfect
sense now why it works since QEMU does it all.