diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 1f7bf56bd2..57ab28c026 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -466,6 +466,15 @@ qemuDomainHostdevNetConfigRestore(virDomainHostdevDefPtr hostdev, bool port_profile_associate = false; int isvf; + /* This is only needed for PCI devices that have been defined + * using . For all others, it is a NOP. + */ + if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS || + hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI || + hostdev->parent.type != VIR_DOMAIN_DEVICE_NET || + !hostdev->parent.data.net) + return 0; + isvf = qemuDomainHostdevIsVirtualFunction(hostdev); if (isvf <= 0) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", @@ -799,14 +808,9 @@ inactivedevs: } resetvfnetconfig: - for (i = 0; last_processed_hostdev_vf != -1 && - i < last_processed_hostdev_vf; i++) { - virDomainHostdevDefPtr hostdev = hostdevs[i]; - if (hostdev->parent.type == VIR_DOMAIN_DEVICE_NET && - hostdev->parent.data.net) { - qemuDomainHostdevNetConfigRestore(hostdev, cfg->stateDir); - } - } + for (i = 0; + last_processed_hostdev_vf != -1 && i < last_processed_hostdev_vf; i++) + qemuDomainHostdevNetConfigRestore(hostdevs[i], cfg->stateDir); reattachdevs: for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { @@ -1270,17 +1274,8 @@ qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, * For SRIOV net host devices, unset mac and port profile before * reset and reattach device */ - for (i = 0; i < nhostdevs; i++) { - virDomainHostdevDefPtr hostdev = hostdevs[i]; - if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) - continue; - if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) - continue; - if (hostdev->parent.type == VIR_DOMAIN_DEVICE_NET && - hostdev->parent.data.net) { - qemuDomainHostdevNetConfigRestore(hostdev, cfg->stateDir); - } - } + for (i = 0; i < nhostdevs; i++) + qemuDomainHostdevNetConfigRestore(hostdevs[i], cfg->stateDir); for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index b6ae21870e..a6a15915c3 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -2519,18 +2519,10 @@ qemuDomainRemovePCIHostDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, virDomainHostdevDefPtr hostdev) { - virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virDomainHostdevSubsysPtr subsys = &hostdev->source.subsys; virPCIDevicePtr pci; virPCIDevicePtr activePci; - /* - * For SRIOV net host devices, unset mac and port profile before - * reset and reattach device - */ - if (hostdev->parent.data.net) - qemuDomainHostdevNetConfigRestore(hostdev, cfg->stateDir); - virObjectLock(driver->activePciHostdevs); virObjectLock(driver->inactivePciHostdevs); pci = virPCIDeviceNew(subsys->u.pci.addr.domain, subsys->u.pci.addr.bus, @@ -2551,7 +2543,6 @@ qemuDomainRemovePCIHostDevice(virQEMUDriverPtr driver, virObjectUnlock(driver->inactivePciHostdevs); qemuDomainReleaseDeviceAddress(vm, hostdev->info, NULL); - virObjectUnref(cfg); } static void @@ -2587,6 +2578,7 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, virDomainHostdevDefPtr hostdev) { + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virDomainNetDefPtr net = NULL; virDomainEventPtr event; size_t i; @@ -2618,6 +2610,8 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver, virDomainAuditHostdev(vm, hostdev, "detach", true); + qemuDomainHostdevNetConfigRestore(hostdev, cfg->stateDir); + switch ((enum virDomainHostdevSubsysType) hostdev->source.subsys.type) { case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: qemuDomainRemovePCIHostDevice(driver, vm, hostdev); @@ -2646,6 +2640,7 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver, networkReleaseActualDevice(net); virDomainNetDefFree(net); } + virObjectUnref(cfg); }