vfio-pci: Fix interrupt disabling
authorAlex Williamson <alex.williamson@redhat.com>
Fri, 9 Jan 2015 15:50:53 +0000 (08:50 -0700)
committerAlex Williamson <alex.williamson@redhat.com>
Fri, 9 Jan 2015 15:50:53 +0000 (08:50 -0700)
commitb3e27c3aee8f5a96debfe0346e9c0e3a641a8516
tree7c961b361bdf7224460ce32fdbc4344f6df835db
parent29c6e6df492d81b1843e5dd999171bb84c6effea
vfio-pci: Fix interrupt disabling

When disabling MSI/X interrupts the disable functions will leave the
device in INTx mode (when available).  This matches how hardware
operates, INTx is enabled unless MSI/X is enabled (DisINTx is handled
separately).  Therefore when we really want to disable all interrupts,
such as when removing the device, and we start with the device in
MSI/X mode, we need to pass through INTx on our way to being
completely quiesced.

In well behaved situations, the guest driver will have shutdown the
device and it will start vfio_exitfn() in INTx mode, producing the
desired result.  If hot-unplug causes the guest to crash, we may get
the device in MSI/X state, which will leave QEMU with a bogus handler
installed.

Fix this by re-ordering our disable routine so that it should always
finish in VFIO_INT_NONE state, which is what all callers expect.

Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
hw/vfio/pci.c