
On Thu, 2009-09-24 at 16:00 +0100, Daniel P. Berrange wrote:
* src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h: Add new API qemuMonitorRemovePCIDevice() for removing PCI device * src/qemu/qemu_driver.c: Convert all places removing PCI devices over to new qemuMonitorRemovePCIDevice() API --- src/qemu/qemu_driver.c | 120 ++++------------------------------------- src/qemu/qemu_monitor_text.c | 60 +++++++++++++++++++++ src/qemu/qemu_monitor_text.h | 6 ++ 3 files changed, 78 insertions(+), 108 deletions(-)
...
diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c index ca84fc6..290dcce 100644 --- a/src/qemu/qemu_monitor_text.c +++ b/src/qemu/qemu_monitor_text.c @@ -1436,3 +1436,63 @@ cleanup: return ret; }
+ +int qemuMonitorRemovePCIDevice(const virDomainObjPtr vm, + unsigned guestDomain, + unsigned guestBus, + unsigned guestSlot) +{ + char *cmd = NULL; + char *reply = NULL; + int tryOldSyntax = 0; + int ret = -1; + +try_command: + if (tryOldSyntax) { + if (virAsprintf(&cmd, "pci_del 0 %.2x", guestSlot) < 0) { + virReportOOMError(NULL); + goto cleanup; + } + } else { + if (virAsprintf(&cmd, "pci_del pci_addr=%.4x:%.2x:%.2x", + guestDomain, guestBus, guestSlot) < 0) { + virReportOOMError(NULL); + goto cleanup; + } + } + + if (qemudMonitorCommand(vm, cmd, &reply) < 0) { + qemudReportError(NULL, NULL, NULL, VIR_ERR_OPERATION_FAILED, + "%s", _("failed to remove PCI device")); + goto cleanup; + } + + DEBUG ("%s: pci_del reply: %s",vm->def->name, reply); + + /* Syntax changed when KVM merged PCI hotplug upstream to QEMU, + * so check for an error message from old KVM indicating the + * need to try the old syntax */ + if (!tryOldSyntax && + strstr(reply, "extraneous characters")) { + tryOldSyntax = 1; + VIR_FREE(reply); + VIR_FREE(cmd); + goto try_command;
This fixes a leak in the old code, would have been nice to have as a separate patch ACK Cheers, Mark.