On Fri, 11 Oct 2019 13:20:07 +0200 Jens Freimann <jfreim...@redhat.com> wrote:
> Only the guest unplug request was triggered. This is needed for > the failover feature. In case of a failed migration we need to > plug the device back to the guest. > > Signed-off-by: Jens Freimann <jfreim...@redhat.com> > --- > hw/pci/pci.c | 2 ++ > hw/pci/pcie.c | 3 +++ > include/hw/pci/pci.h | 1 + > 3 files changed, 6 insertions(+) > > diff --git a/hw/pci/pci.c b/hw/pci/pci.c > index aa05c2b9b2..c140b37765 100644 > --- a/hw/pci/pci.c > +++ b/hw/pci/pci.c > @@ -2078,6 +2078,8 @@ static void pci_qdev_realize(DeviceState *qdev, Error > **errp) > Error *local_err = NULL; > bool is_default_rom; > > + pci_dev->partially_hotplugged = false; This is redundant though since the object is zero initialized on allocation, right? Thanks, Alex > + > /* initialize cap_present for pci_is_express() and pci_config_size(), > * Note that hybrid PCIs are not set automatically and need to manage > * QEMU_PCI_CAP_EXPRESS manually */ > diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c > index a6beb567bd..19363ff8ce 100644 > --- a/hw/pci/pcie.c > +++ b/hw/pci/pcie.c > @@ -456,6 +456,9 @@ static void pcie_unplug_device(PCIBus *bus, PCIDevice > *dev, void *opaque) > { > HotplugHandler *hotplug_ctrl = qdev_get_hotplug_handler(DEVICE(dev)); > > + if (dev->partially_hotplugged) { > + return; > + } > hotplug_handler_unplug(hotplug_ctrl, DEVICE(dev), &error_abort); > object_unparent(OBJECT(dev)); > } > diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h > index f3f0ffd5fb..f3a39c9bbd 100644 > --- a/include/hw/pci/pci.h > +++ b/include/hw/pci/pci.h > @@ -265,6 +265,7 @@ typedef struct PCIReqIDCache PCIReqIDCache; > > struct PCIDevice { > DeviceState qdev; > + bool partially_hotplugged; > > /* PCI config space */ > uint8_t *config;