qemu: simplify calling qemuDomainHostdevNetConfigRestore

This function was called in three places, and in each the call was
qualified by a slightly different conditional. In reality, this
function should only be called for a hostdev if all of the following
are true:

  1) mode='subsystem'
  2) type='pci'
  3) there is a parent device definition which is an <interface>
     (VIR_DOMAIN_DEVICE_NET)

We can simplify the callers and make them more consistent by checking
these conditions at the top ov qemuDomainHostdevNetConfigRestore and
returning 0 if one of them isn't satisfied.

The location of the call to qemuDomainHostdevNetConfigRestore() has
also been changed in the hot-plug case - it is moved into the caller
of its previous location (i.e. from qemuDomainRemovePCIHostDevice() to
qemuDomainRemoveHostDevice()). This was done to be more consistent
about which functions pay attention to whether or not this is one of
the special <interface> hostdevs or just a normal hostdev -
qemuDomainRemoveHostDevice() already contained a call to
networkReleaseActualDevice() and virDomainNetDefFree(), so it makes
sense for it to also handle the resetting of the device's MAC address
and vlan tag (which is what's done by
qemuDomainHostdevNetConfigRestore()).
This commit is contained in:
Laine Stump 2013-10-18 11:39:08 +03:00
parent 8adc92694f
commit 7a600cf77f
2 changed files with 18 additions and 28 deletions

View File

@ -466,6 +466,15 @@ qemuDomainHostdevNetConfigRestore(virDomainHostdevDefPtr hostdev,
bool port_profile_associate = false; bool port_profile_associate = false;
int isvf; int isvf;
/* This is only needed for PCI devices that have been defined
* using <interface type='hostdev'>. 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); isvf = qemuDomainHostdevIsVirtualFunction(hostdev);
if (isvf <= 0) { if (isvf <= 0) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
@ -799,14 +808,9 @@ inactivedevs:
} }
resetvfnetconfig: resetvfnetconfig:
for (i = 0; last_processed_hostdev_vf != -1 && for (i = 0;
i < last_processed_hostdev_vf; i++) { last_processed_hostdev_vf != -1 && i < last_processed_hostdev_vf; i++)
virDomainHostdevDefPtr hostdev = hostdevs[i]; qemuDomainHostdevNetConfigRestore(hostdevs[i], cfg->stateDir);
if (hostdev->parent.type == VIR_DOMAIN_DEVICE_NET &&
hostdev->parent.data.net) {
qemuDomainHostdevNetConfigRestore(hostdev, cfg->stateDir);
}
}
reattachdevs: reattachdevs:
for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { 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 * For SRIOV net host devices, unset mac and port profile before
* reset and reattach device * reset and reattach device
*/ */
for (i = 0; i < nhostdevs; i++) { for (i = 0; i < nhostdevs; i++)
virDomainHostdevDefPtr hostdev = hostdevs[i]; qemuDomainHostdevNetConfigRestore(hostdevs[i], cfg->stateDir);
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 < virPCIDeviceListCount(pcidevs); i++) { for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) {
virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i);

View File

@ -2519,18 +2519,10 @@ qemuDomainRemovePCIHostDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
virDomainHostdevDefPtr hostdev) virDomainHostdevDefPtr hostdev)
{ {
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
virDomainHostdevSubsysPtr subsys = &hostdev->source.subsys; virDomainHostdevSubsysPtr subsys = &hostdev->source.subsys;
virPCIDevicePtr pci; virPCIDevicePtr pci;
virPCIDevicePtr activePci; 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->activePciHostdevs);
virObjectLock(driver->inactivePciHostdevs); virObjectLock(driver->inactivePciHostdevs);
pci = virPCIDeviceNew(subsys->u.pci.addr.domain, subsys->u.pci.addr.bus, pci = virPCIDeviceNew(subsys->u.pci.addr.domain, subsys->u.pci.addr.bus,
@ -2551,7 +2543,6 @@ qemuDomainRemovePCIHostDevice(virQEMUDriverPtr driver,
virObjectUnlock(driver->inactivePciHostdevs); virObjectUnlock(driver->inactivePciHostdevs);
qemuDomainReleaseDeviceAddress(vm, hostdev->info, NULL); qemuDomainReleaseDeviceAddress(vm, hostdev->info, NULL);
virObjectUnref(cfg);
} }
static void static void
@ -2587,6 +2578,7 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
virDomainHostdevDefPtr hostdev) virDomainHostdevDefPtr hostdev)
{ {
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
virDomainNetDefPtr net = NULL; virDomainNetDefPtr net = NULL;
virDomainEventPtr event; virDomainEventPtr event;
size_t i; size_t i;
@ -2618,6 +2610,8 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,
virDomainAuditHostdev(vm, hostdev, "detach", true); virDomainAuditHostdev(vm, hostdev, "detach", true);
qemuDomainHostdevNetConfigRestore(hostdev, cfg->stateDir);
switch ((enum virDomainHostdevSubsysType) hostdev->source.subsys.type) { switch ((enum virDomainHostdevSubsysType) hostdev->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
qemuDomainRemovePCIHostDevice(driver, vm, hostdev); qemuDomainRemovePCIHostDevice(driver, vm, hostdev);
@ -2646,6 +2640,7 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,
networkReleaseActualDevice(net); networkReleaseActualDevice(net);
virDomainNetDefFree(net); virDomainNetDefFree(net);
} }
virObjectUnref(cfg);
} }