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 fe38c4c..2ba2e0f 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -32,6 +32,8 @@ #include "hw/pci/pci_host.h" #include "hw/qdev-properties.h" #include "hw/qdev-properties-system.h" +#include "migration/cpr.h" +#include "migration/misc.h" #include "migration/qemu-file-types.h" #include "migration/vmstate.h" #include "net/net.h" @@ -537,6 +539,17 @@ 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 vmstate load will + * set all fields that would have been set here. + */ + if (cpr_is_incoming()) { + return; + } + pci_device_deassert_intx(dev); assert(dev->irq_state == 0); -- 1.8.3.1