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.