[libvirt] [PATCH 0/3] qemu: Several PCI device assignment fixes

Jiri Denemark (3): qemu: Re-reserve all PCI addresses on libvirtd restart qemu: Release PCI slot when detaching disk and net devices qemu: Fix copy&paste error in warning message src/qemu/qemu_driver.c | 18 ++++++++++++++---- 1 files changed, 14 insertions(+), 4 deletions(-) -- 1.7.2

When reconnecting to existing VMs, we re-reserved only those PCI addresses which were explicitly mentioned in domain XML. Since some addresses are always reserved (e.g., 0:0:0 and 0:0:1), we need to handle those too. Also all this should only be done if device flag is supported by qemu. --- src/qemu/qemu_driver.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index e718816..2ca3940 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1455,11 +1455,13 @@ qemuReconnectDomain(void *payload, const char *name ATTRIBUTE_UNUSED, void *opaq if (qemudExtractVersionInfo(obj->def->emulator, NULL, &qemuCmdFlags) >= 0 && - (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)) + (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)) { priv->persistentAddrs = 1; - if (!(priv->pciaddrs = qemuDomainPCIAddressSetCreate(obj->def))) - goto error; + if (!(priv->pciaddrs = qemuDomainPCIAddressSetCreate(obj->def)) || + qemuAssignDevicePCISlots(obj->def, priv->pciaddrs) < 0) + goto error; + } if (driver->securityDriver && driver->securityDriver->domainReserveSecurityLabel && -- 1.7.2

On Fri, Aug 13, 2010 at 05:26:45PM +0200, Jiri Denemark wrote:
When reconnecting to existing VMs, we re-reserved only those PCI addresses which were explicitly mentioned in domain XML. Since some addresses are always reserved (e.g., 0:0:0 and 0:0:1), we need to handle those too.
Also all this should only be done if device flag is supported by qemu. --- src/qemu/qemu_driver.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index e718816..2ca3940 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1455,11 +1455,13 @@ qemuReconnectDomain(void *payload, const char *name ATTRIBUTE_UNUSED, void *opaq if (qemudExtractVersionInfo(obj->def->emulator, NULL, &qemuCmdFlags) >= 0 && - (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)) + (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)) { priv->persistentAddrs = 1;
- if (!(priv->pciaddrs = qemuDomainPCIAddressSetCreate(obj->def))) - goto error; + if (!(priv->pciaddrs = qemuDomainPCIAddressSetCreate(obj->def)) || + qemuAssignDevicePCISlots(obj->def, priv->pciaddrs) < 0) + goto error; + }
if (driver->securityDriver && driver->securityDriver->domainReserveSecurityLabel &&
ACK Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|

--- src/qemu/qemu_driver.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 2ca3940..108f67b 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -8649,6 +8649,10 @@ static int qemudDomainDetachPciDiskDevice(struct qemud_driver *driver, } qemuDomainObjExitMonitorWithDriver(driver, vm); + if ((qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) && + qemuDomainPCIAddressReleaseAddr(priv->pciaddrs, &detach->info) < 0) + VIR_WARN("Unable to release PCI address on %s", dev->data.disk->src); + qemudShrinkDisks(vm->def, i); virDomainDiskDefFree(detach); @@ -8890,6 +8894,10 @@ qemudDomainDetachNetDevice(struct qemud_driver *driver, } qemuDomainObjExitMonitorWithDriver(driver, vm); + if ((qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) && + qemuDomainPCIAddressReleaseAddr(priv->pciaddrs, &detach->info) < 0) + VIR_WARN0("Unable to release PCI address on NIC"); + virDomainConfNWFilterTeardown(detach); #if WITH_MACVTAP -- 1.7.2

On Fri, Aug 13, 2010 at 05:26:46PM +0200, Jiri Denemark wrote:
--- src/qemu/qemu_driver.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 2ca3940..108f67b 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -8649,6 +8649,10 @@ static int qemudDomainDetachPciDiskDevice(struct qemud_driver *driver, } qemuDomainObjExitMonitorWithDriver(driver, vm);
+ if ((qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) && + qemuDomainPCIAddressReleaseAddr(priv->pciaddrs, &detach->info) < 0) + VIR_WARN("Unable to release PCI address on %s", dev->data.disk->src); + qemudShrinkDisks(vm->def, i);
virDomainDiskDefFree(detach); @@ -8890,6 +8894,10 @@ qemudDomainDetachNetDevice(struct qemud_driver *driver, } qemuDomainObjExitMonitorWithDriver(driver, vm);
+ if ((qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) && + qemuDomainPCIAddressReleaseAddr(priv->pciaddrs, &detach->info) < 0) + VIR_WARN0("Unable to release PCI address on NIC"); + virDomainConfNWFilterTeardown(detach);
#if WITH_MACVTAP
ACK Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|

This also makes the message consistent with the message used in error path of qemudDomainAttachHostPciDevice. --- src/qemu/qemu_driver.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 108f67b..dbc3d5c 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -9020,7 +9020,7 @@ static int qemudDomainDetachHostPciDevice(struct qemud_driver *driver, if ((qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) && qemuDomainPCIAddressReleaseAddr(priv->pciaddrs, &detach->info) < 0) - VIR_WARN0("Unable to release PCI address on controller"); + VIR_WARN0("Unable to release PCI address on host device"); if (vm->def->nhostdevs > 1) { memmove(vm->def->hostdevs + i, -- 1.7.2

On Fri, Aug 13, 2010 at 05:26:47PM +0200, Jiri Denemark wrote:
This also makes the message consistent with the message used in error path of qemudDomainAttachHostPciDevice. --- src/qemu/qemu_driver.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 108f67b..dbc3d5c 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -9020,7 +9020,7 @@ static int qemudDomainDetachHostPciDevice(struct qemud_driver *driver,
if ((qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) && qemuDomainPCIAddressReleaseAddr(priv->pciaddrs, &detach->info) < 0) - VIR_WARN0("Unable to release PCI address on controller"); + VIR_WARN0("Unable to release PCI address on host device");
if (vm->def->nhostdevs > 1) { memmove(vm->def->hostdevs + i,
ACK Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
participants (2)
-
Daniel P. Berrange
-
Jiri Denemark