Do not reset a vfio-pci device during CPR. Signed-off-by: Steve Sistare <steven.sist...@oracle.com> --- hw/pci/pci.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 2afa423..16b4f71 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -32,6 +32,7 @@ #include "hw/pci/pci_host.h" #include "hw/qdev-properties.h" #include "hw/qdev-properties-system.h" +#include "migration/misc.h" #include "migration/qemu-file-types.h" #include "migration/vmstate.h" #include "net/net.h" @@ -459,6 +460,18 @@ static void pci_reset_regions(PCIDevice *dev) static void pci_do_device_reset(PCIDevice *dev) { + /* + * A PCI device that is resuming for cpr is already configured, so do + * not reset it here when we are called from qemu_system_reset prior to + * cpr load, else interrupts may be lost for vfio-pci devices. It is + * safe to skip this reset for all PCI devices, because cpr load will set + * all fields that would have been set here. + */ + MigMode mode = migrate_mode(); + if (mode == MIG_MODE_CPR_TRANSFER) { + return; + } + pci_device_deassert_intx(dev); assert(dev->irq_state == 0); -- 1.8.3.1