Some functions were using virDomainDeviceInfo where virDevicePCIAddress would suffice. Some were only using integers for slots and functions, assuming the bus numbers are always 0. Switch from virDomainDeviceInfoPtr to virDevicePCIAddressPtr: qemuPCIAddressAsString qemuDomainPCIAddressCheckSlot qemuDomainPCIAddressReserveAddr qemuDomainPCIAddressReleaseAddr Switch from int slot to virDevicePCIAddressPtr: qemuDomainPCIAddressReserveSlot qemuDomainPCIAddressReleaseSlot qemuDomainPCIAddressGetNextSlot Deleted functions (they would take the same parameters as ReserveAddr/ReleaseAddr do now.) qemuDomainPCIAddressReserveFunction qemuDomainPCIAddressReleaseFunction --- src/qemu/qemu_command.c | 267 +++++++++++++++++++++--------------------------- src/qemu/qemu_command.h | 13 +-- src/qemu/qemu_hotplug.c | 16 +-- 3 files changed, 127 insertions(+), 169 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 6c28123..b50e779 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -953,30 +953,30 @@ cleanup: #define QEMU_PCI_ADDRESS_LAST_FUNCTION 8 struct _qemuDomainPCIAddressSet { virHashTablePtr used; - int nextslot; + virDevicePCIAddress lastaddr; }; -static char *qemuPCIAddressAsString(virDomainDeviceInfoPtr dev) +static char *qemuPCIAddressAsString(virDevicePCIAddressPtr addr) { - char *addr; + char *str; - if (dev->addr.pci.domain != 0 || - dev->addr.pci.bus != 0) { + if (addr->domain != 0 || + addr->bus != 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Only PCI domain 0 and bus 0 are available")); return NULL; } - if (virAsprintf(&addr, "%d:%d:%d.%d", - dev->addr.pci.domain, - dev->addr.pci.bus, - dev->addr.pci.slot, - dev->addr.pci.function) < 0) { + if (virAsprintf(&str, "%d:%d:%d.%d", + addr->domain, + addr->bus, + addr->slot, + addr->function) < 0) { virReportOOMError(); return NULL; } - return addr; + return str; } @@ -999,7 +999,7 @@ static int qemuCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, return 0; } - addr = qemuPCIAddressAsString(info); + addr = qemuPCIAddressAsString(&info->addr.pci); if (!addr) goto cleanup; @@ -1024,12 +1024,11 @@ static int qemuCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED, if ((info->addr.pci.function == 0) && (info->addr.pci.multi != VIR_DEVICE_ADDRESS_PCI_MULTI_ON)) { /* a function 0 w/o multifunction=on must reserve the entire slot */ - int function; - virDomainDeviceInfo temp_info = *info; + virDevicePCIAddress tmp_addr = info->addr.pci; + unsigned int *func = &tmp_addr.function; - for (function = 1; function < QEMU_PCI_ADDRESS_LAST_FUNCTION; function++) { - temp_info.addr.pci.function = function; - addr = qemuPCIAddressAsString(&temp_info); + for (*func = 1; *func < QEMU_PCI_ADDRESS_LAST_FUNCTION; (*func)++) { + addr = qemuPCIAddressAsString(&tmp_addr); if (!addr) goto cleanup; @@ -1142,90 +1141,75 @@ error: * is used by the other device. */ static int qemuDomainPCIAddressCheckSlot(qemuDomainPCIAddressSetPtr addrs, - virDomainDeviceInfoPtr dev) + virDevicePCIAddressPtr addr) { - char *addr; - virDomainDeviceInfo temp_dev; - int function; - - temp_dev = *dev; - for (function = 0; function < QEMU_PCI_ADDRESS_LAST_FUNCTION; function++) { - temp_dev.addr.pci.function = function; - addr = qemuPCIAddressAsString(&temp_dev); - if (!addr) + char *str; + virDevicePCIAddress tmp_addr = *addr; + unsigned int *func = &(tmp_addr.function); + + for (*func = 0; *func < QEMU_PCI_ADDRESS_LAST_FUNCTION; (*func)++) { + str = qemuPCIAddressAsString(&tmp_addr); + if (!str) return -1; - if (virHashLookup(addrs->used, addr)) { - VIR_FREE(addr); + if (virHashLookup(addrs->used, str)) { + VIR_FREE(str); return -1; } - VIR_FREE(addr); + VIR_FREE(str); } return 0; } int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs, - virDomainDeviceInfoPtr dev) + virDevicePCIAddressPtr addr) { - char *addr; + char *str; - addr = qemuPCIAddressAsString(dev); - if (!addr) + str = qemuPCIAddressAsString(addr); + if (!str) return -1; - VIR_DEBUG("Reserving PCI addr %s", addr); + VIR_DEBUG("Reserving PCI addr %s", str); - if (virHashLookup(addrs->used, addr)) { + if (virHashLookup(addrs->used, str)) { virReportError(VIR_ERR_INTERNAL_ERROR, - _("unable to reserve PCI address %s"), addr); - VIR_FREE(addr); + _("unable to reserve PCI address %s"), str); + VIR_FREE(str); return -1; } - if (virHashAddEntry(addrs->used, addr, addr)) { - VIR_FREE(addr); + if (virHashAddEntry(addrs->used, str, str)) { + VIR_FREE(str); return -1; } - if (dev->addr.pci.slot > addrs->nextslot) { - addrs->nextslot = dev->addr.pci.slot + 1; - if (QEMU_PCI_ADDRESS_LAST_SLOT < addrs->nextslot) - addrs->nextslot = 0; - } - + addrs->lastaddr = *addr; + addrs->lastaddr.function = 0; + addrs->lastaddr.multi = 0; return 0; } -int qemuDomainPCIAddressReserveFunction(qemuDomainPCIAddressSetPtr addrs, - int slot, int function) -{ - virDomainDeviceInfo dev; - - dev.addr.pci.domain = 0; - dev.addr.pci.bus = 0; - dev.addr.pci.slot = slot; - dev.addr.pci.function = function; - - return qemuDomainPCIAddressReserveAddr(addrs, &dev); -} - int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs, - int slot) + virDevicePCIAddressPtr addr) { - int function; + virDevicePCIAddress tmp_addr = *addr; + unsigned int *func = &tmp_addr.function; + int i; - for (function = 0; function < QEMU_PCI_ADDRESS_LAST_FUNCTION; function++) { - if (qemuDomainPCIAddressReserveFunction(addrs, slot, function) < 0) + for (*func = 0; *func < QEMU_PCI_ADDRESS_LAST_FUNCTION; (*func)++) { + if (qemuDomainPCIAddressReserveAddr(addrs, &tmp_addr) < 0) goto cleanup; } return 0; cleanup: - for (function--; function >= 0; function--) { - qemuDomainPCIAddressReleaseFunction(addrs, slot, function); + for (i = *func; i >= 0; i--) { + *func = i; + qemuDomainPCIAddressReleaseAddr(addrs, &tmp_addr); } return -1; } @@ -1245,7 +1229,7 @@ int qemuDomainPCIAddressEnsureAddr(qemuDomainPCIAddressSetPtr addrs, return -1; } - ret = qemuDomainPCIAddressReserveSlot(addrs, dev->addr.pci.slot); + ret = qemuDomainPCIAddressReserveSlot(addrs, &dev->addr.pci); } else { ret = qemuDomainPCIAddressSetNextAddr(addrs, dev); } @@ -1254,59 +1238,43 @@ int qemuDomainPCIAddressEnsureAddr(qemuDomainPCIAddressSetPtr addrs, int qemuDomainPCIAddressReleaseAddr(qemuDomainPCIAddressSetPtr addrs, - virDomainDeviceInfoPtr dev) + virDevicePCIAddressPtr addr) { - char *addr; + char *str; int ret; - addr = qemuPCIAddressAsString(dev); - if (!addr) + str = qemuPCIAddressAsString(addr); + if (!str) return -1; - ret = virHashRemoveEntry(addrs->used, addr); + ret = virHashRemoveEntry(addrs->used, str); - VIR_FREE(addr); + VIR_FREE(str); return ret; } -int qemuDomainPCIAddressReleaseFunction(qemuDomainPCIAddressSetPtr addrs, - int slot, int function) +int qemuDomainPCIAddressReleaseSlot(qemuDomainPCIAddressSetPtr addrs, + virDevicePCIAddressPtr addr) { - virDomainDeviceInfo dev; - - dev.addr.pci.domain = 0; - dev.addr.pci.bus = 0; - dev.addr.pci.slot = slot; - dev.addr.pci.function = function; - - return qemuDomainPCIAddressReleaseAddr(addrs, &dev); -} - -int qemuDomainPCIAddressReleaseSlot(qemuDomainPCIAddressSetPtr addrs, int slot) -{ - virDomainDeviceInfo dev; - char *addr; + char *str; int ret = 0; - unsigned int *function = &dev.addr.pci.function; - - dev.addr.pci.domain = 0; - dev.addr.pci.bus = 0; - dev.addr.pci.slot = slot; + virDevicePCIAddress tmp_addr = *addr; + unsigned int *func = &tmp_addr.function; - for (*function = 0; *function < QEMU_PCI_ADDRESS_LAST_FUNCTION; (*function)++) { - addr = qemuPCIAddressAsString(&dev); - if (!addr) + for (*func = 0; *func < QEMU_PCI_ADDRESS_LAST_FUNCTION; (*func)++) { + str = qemuPCIAddressAsString(&tmp_addr); + if (!str) return -1; - if (!virHashLookup(addrs->used, addr)) { - VIR_FREE(addr); + if (!virHashLookup(addrs->used, str)) { + VIR_FREE(str); continue; } - VIR_FREE(addr); + VIR_FREE(str); - if (qemuDomainPCIAddressReleaseFunction(addrs, slot, *function) < 0) + if (qemuDomainPCIAddressReleaseAddr(addrs, &tmp_addr) < 0) ret = -1; } @@ -1323,28 +1291,24 @@ void qemuDomainPCIAddressSetFree(qemuDomainPCIAddressSetPtr addrs) } -static int qemuDomainPCIAddressGetNextSlot(qemuDomainPCIAddressSetPtr addrs) +static int +qemuDomainPCIAddressGetNextSlot(qemuDomainPCIAddressSetPtr addrs, + virDevicePCIAddressPtr next_addr) { + virDevicePCIAddress tmp_addr = addrs->lastaddr; int i; - int iteration; - - for (i = addrs->nextslot, iteration = 0; - iteration <= QEMU_PCI_ADDRESS_LAST_SLOT; i++, iteration++) { - virDomainDeviceInfo maybe; - char *addr; + char *addr; - if (QEMU_PCI_ADDRESS_LAST_SLOT < i) - i = 0; - memset(&maybe, 0, sizeof(maybe)); - maybe.addr.pci.domain = 0; - maybe.addr.pci.bus = 0; - maybe.addr.pci.slot = i; - maybe.addr.pci.function = 0; + tmp_addr.slot++; + for (i = 0; i <= QEMU_PCI_ADDRESS_LAST_SLOT; i++, tmp_addr.slot++) { + if (QEMU_PCI_ADDRESS_LAST_SLOT < tmp_addr.slot) { + tmp_addr.slot = 0; + } - if (!(addr = qemuPCIAddressAsString(&maybe))) + if (!(addr = qemuPCIAddressAsString(&tmp_addr))) return -1; - if (qemuDomainPCIAddressCheckSlot(addrs, &maybe) < 0) { + if (qemuDomainPCIAddressCheckSlot(addrs, &tmp_addr) < 0) { VIR_DEBUG("PCI addr %s already in use", addr); VIR_FREE(addr); continue; @@ -1353,7 +1317,9 @@ static int qemuDomainPCIAddressGetNextSlot(qemuDomainPCIAddressSetPtr addrs) VIR_DEBUG("Found free PCI addr %s", addr); VIR_FREE(addr); - return i; + addrs->lastaddr = tmp_addr; + *next_addr = tmp_addr; + return 0; } virReportError(VIR_ERR_INTERNAL_ERROR, @@ -1364,24 +1330,17 @@ static int qemuDomainPCIAddressGetNextSlot(qemuDomainPCIAddressSetPtr addrs) int qemuDomainPCIAddressSetNextAddr(qemuDomainPCIAddressSetPtr addrs, virDomainDeviceInfoPtr dev) { - int slot = qemuDomainPCIAddressGetNextSlot(addrs); - - if (slot < 0) + virDevicePCIAddress addr; + if (qemuDomainPCIAddressGetNextSlot(addrs, &addr) < 0) return -1; - if (qemuDomainPCIAddressReserveSlot(addrs, slot) < 0) + if (qemuDomainPCIAddressReserveSlot(addrs, &addr) < 0) return -1; dev->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; - dev->addr.pci.bus = 0; - dev->addr.pci.domain = 0; - dev->addr.pci.slot = slot; - dev->addr.pci.function = 0; - - addrs->nextslot = slot + 1; - if (QEMU_PCI_ADDRESS_LAST_SLOT < addrs->nextslot) - addrs->nextslot = 0; + dev->addr.pci = addr; + addrs->lastaddr = addr; return 0; } @@ -1433,11 +1392,15 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, size_t i, j; bool reservedIDE = false; bool reservedUSB = false; - int function; bool qemuDeviceVideoUsable = virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY); + virDevicePCIAddress tmp_addr; + virDevicePCIAddressPtr addrptr; + unsigned int *func = &tmp_addr.function; + - /* Host bridge */ - if (qemuDomainPCIAddressReserveSlot(addrs, 0) < 0) + /* Reserve slot 0 for the host bridge */ + memset(&tmp_addr, 0, sizeof(tmp_addr)); + if (qemuDomainPCIAddressReserveSlot(addrs, &tmp_addr) < 0) goto error; /* Verify that first IDE and USB controllers (if any) is on the PIIX3, fn 1 */ @@ -1491,13 +1454,15 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, /* PIIX3 (ISA bridge, IDE controller, something else unknown, USB controller) * hardcoded slot=1, multifunction device */ - for (function = 0; function < QEMU_PCI_ADDRESS_LAST_FUNCTION; function++) { - if ((function == 1 && reservedIDE) || - (function == 2 && reservedUSB)) + memset(&tmp_addr, 0, sizeof(tmp_addr)); + tmp_addr.slot = 1; + for (*func = 0; *func < QEMU_PCI_ADDRESS_LAST_FUNCTION; (*func)++) { + if ((*func == 1 && reservedIDE) || + (*func == 2 && reservedUSB)) /* we have reserved this pci address */ continue; - if (qemuDomainPCIAddressReserveFunction(addrs, 1, function) < 0) + if (qemuDomainPCIAddressReserveAddr(addrs, &tmp_addr) < 0) goto error; } @@ -1509,11 +1474,12 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, primaryVideo->info.addr.pci.bus = 0; primaryVideo->info.addr.pci.slot = 2; primaryVideo->info.addr.pci.function = 0; + addrptr = &primaryVideo->info.addr.pci; - if (qemuDomainPCIAddressCheckSlot(addrs, &primaryVideo->info) < 0) { + if (qemuDomainPCIAddressCheckSlot(addrs, addrptr) < 0) { if (qemuDeviceVideoUsable) { virResetLastError(); - if (qemuDomainPCIAddressSetNextAddr(addrs, &primaryVideo->info) < 0) + if (qemuDomainPCIAddressSetNextAddr(addrs,&primaryVideo->info) < 0) goto error; } else { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", @@ -1521,7 +1487,7 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, "QEMU needs it for primary video")); goto error; } - } else if (qemuDomainPCIAddressReserveSlot(addrs, 2) < 0) { + } else if (qemuDomainPCIAddressReserveSlot(addrs, addrptr) < 0) { goto error; } } else if (!qemuDeviceVideoUsable) { @@ -1537,16 +1503,15 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, * has already reserved the address, so we must skip */ } } else if (!qemuDeviceVideoUsable) { - virDomainDeviceInfo dev; - memset(&dev, 0, sizeof(dev)); - dev.addr.pci.slot = 2; + memset(&tmp_addr, 0, sizeof(tmp_addr)); + tmp_addr.slot = 2; - if (qemuDomainPCIAddressCheckSlot(addrs, &dev) < 0) { + if (qemuDomainPCIAddressCheckSlot(addrs, &tmp_addr) < 0) { VIR_DEBUG("PCI address 0:0:2.0 in use, future addition of a video" " device will not be possible without manual" " intervention"); virResetLastError(); - } else if (qemuDomainPCIAddressReserveSlot(addrs, 2) < 0) { + } else if (qemuDomainPCIAddressReserveSlot(addrs, &tmp_addr) < 0) { goto error; } } @@ -1609,6 +1574,7 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, /* USB2 needs special handling to put all companions in the same slot */ if (IS_USB2_CONTROLLER(def->controllers[i])) { virDevicePCIAddress addr = { 0, 0, 0, 0, false }; + memset(&tmp_addr, 0, sizeof(tmp_addr)); for (j = 0 ; j < i ; j++) { if (IS_USB2_CONTROLLER(def->controllers[j]) && def->controllers[j]->idx == def->controllers[i]->idx) { @@ -1636,19 +1602,14 @@ qemuAssignDevicePCISlots(virDomainDefPtr def, if (addr.slot == 0) { /* This is the first part of the controller, so need * to find a free slot & then reserve a function */ - int slot = qemuDomainPCIAddressGetNextSlot(addrs); - if (slot < 0) + if (qemuDomainPCIAddressGetNextSlot(addrs, &tmp_addr) < 0) goto error; - addr.slot = slot; - addrs->nextslot = addr.slot + 1; - if (QEMU_PCI_ADDRESS_LAST_SLOT < addrs->nextslot) - addrs->nextslot = 0; + addr.bus = tmp_addr.bus; + addr.slot = tmp_addr.slot; } /* Finally we can reserve the slot+function */ - if (qemuDomainPCIAddressReserveFunction(addrs, - addr.slot, - addr.function) < 0) + if (qemuDomainPCIAddressReserveAddr(addrs, &addr) < 0) goto error; def->controllers[i]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI; diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index 7e52c5d..e4db000 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -194,21 +194,18 @@ int qemuDomainAssignPCIAddresses(virDomainDefPtr def, virQEMUCapsPtr qemuCaps, virDomainObjPtr obj); qemuDomainPCIAddressSetPtr qemuDomainPCIAddressSetCreate(virDomainDefPtr def); -int qemuDomainPCIAddressReserveFunction(qemuDomainPCIAddressSetPtr addrs, - int slot, int function); int qemuDomainPCIAddressReserveSlot(qemuDomainPCIAddressSetPtr addrs, - int slot); + virDevicePCIAddressPtr addr); int qemuDomainPCIAddressReserveAddr(qemuDomainPCIAddressSetPtr addrs, - virDomainDeviceInfoPtr dev); + virDevicePCIAddressPtr addr); int qemuDomainPCIAddressSetNextAddr(qemuDomainPCIAddressSetPtr addrs, virDomainDeviceInfoPtr dev); int qemuDomainPCIAddressEnsureAddr(qemuDomainPCIAddressSetPtr addrs, virDomainDeviceInfoPtr dev); int qemuDomainPCIAddressReleaseAddr(qemuDomainPCIAddressSetPtr addrs, - virDomainDeviceInfoPtr dev); -int qemuDomainPCIAddressReleaseFunction(qemuDomainPCIAddressSetPtr addrs, - int slot, int function); -int qemuDomainPCIAddressReleaseSlot(qemuDomainPCIAddressSetPtr addrs, int slot); + virDevicePCIAddressPtr addr); +int qemuDomainPCIAddressReleaseSlot(qemuDomainPCIAddressSetPtr addrs, + virDevicePCIAddressPtr addr); void qemuDomainPCIAddressSetFree(qemuDomainPCIAddressSetPtr addrs); int qemuAssignDevicePCISlots(virDomainDefPtr def, diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 488a440..4b34122 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -325,7 +325,7 @@ error: (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) && releaseaddr && qemuDomainPCIAddressReleaseSlot(priv->pciaddrs, - disk->info.addr.pci.slot) < 0) + &disk->info.addr.pci) < 0) VIR_WARN("Unable to release PCI address on %s", disk->src); if (virSecurityManagerRestoreImageLabel(driver->securityManager, @@ -402,7 +402,7 @@ cleanup: (controller->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) && releaseaddr && qemuDomainPCIAddressReleaseSlot(priv->pciaddrs, - controller->info.addr.pci.slot) < 0) + &controller->info.addr.pci) < 0) VIR_WARN("Unable to release PCI address on controller"); VIR_FREE(devstr); @@ -899,7 +899,7 @@ cleanup: (net->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) && releaseaddr && qemuDomainPCIAddressReleaseSlot(priv->pciaddrs, - net->info.addr.pci.slot) < 0) + &net->info.addr.pci) < 0) VIR_WARN("Unable to release PCI address on NIC"); if (iface_connected) { @@ -1042,7 +1042,7 @@ error: (hostdev->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) && releaseaddr && qemuDomainPCIAddressReleaseSlot(priv->pciaddrs, - hostdev->info->addr.pci.slot) < 0) + &hostdev->info->addr.pci) < 0) VIR_WARN("Unable to release PCI address on host device"); qemuDomainReAttachHostdevDevices(driver, vm->def->name, &hostdev, 1); @@ -2084,7 +2084,7 @@ int qemuDomainDetachPciDiskDevice(virQEMUDriverPtr driver, if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) && qemuDomainPCIAddressReleaseSlot(priv->pciaddrs, - detach->info.addr.pci.slot) < 0) + &detach->info.addr.pci) < 0) VIR_WARN("Unable to release PCI address on %s", dev->data.disk->src); virDomainDiskRemove(vm->def, i); @@ -2321,7 +2321,7 @@ int qemuDomainDetachPciControllerDevice(virQEMUDriverPtr driver, if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) && qemuDomainPCIAddressReleaseSlot(priv->pciaddrs, - detach->info.addr.pci.slot) < 0) + &detach->info.addr.pci) < 0) VIR_WARN("Unable to release PCI address on controller"); ret = 0; @@ -2397,7 +2397,7 @@ qemuDomainDetachHostPciDevice(virQEMUDriverPtr driver, if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) && qemuDomainPCIAddressReleaseSlot(priv->pciaddrs, - detach->info->addr.pci.slot) < 0) + &detach->info->addr.pci) < 0) VIR_WARN("Unable to release PCI address on host device"); cleanup: @@ -2649,7 +2649,7 @@ qemuDomainDetachNetDevice(virQEMUDriverPtr driver, if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) && qemuDomainPCIAddressReleaseSlot(priv->pciaddrs, - detach->info.addr.pci.slot) < 0) + &detach->info.addr.pci) < 0) VIR_WARN("Unable to release PCI address on NIC"); virDomainConfNWFilterTeardown(detach); -- 1.7.12.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list