This patch implements live hotplug of a cpu device.
Signed-off-by: Zhu Guihua <zhugh.fnst(a)cn.fujitsu.com>
---
src/qemu/qemu_driver.c | 6 ++++++
src/qemu/qemu_hotplug.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++
src/qemu/qemu_hotplug.h | 7 +++++++
3 files changed, 68 insertions(+)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index a88f6b4..ddc7eeb 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -6995,6 +6995,12 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm,
break;
case VIR_DOMAIN_DEVICE_CPU:
+ ret = qemuDomainAttachCPUDevice(driver, vm,
+ dev->data.cpu);
+ if (!ret)
+ dev->data.cpu = NULL;
+ break;
+
case VIR_DOMAIN_DEVICE_NONE:
case VIR_DOMAIN_DEVICE_FS:
case VIR_DOMAIN_DEVICE_INPUT:
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index f6d7667..bff0d14 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1541,6 +1541,61 @@ int qemuDomainAttachChrDevice(virQEMUDriverPtr driver,
return ret;
}
+int
+qemuDomainCPUInsert(virDomainDefPtr vmdef,
+ virDomainCPUDefPtr cpu)
+{
+ if (virDomainCPUFind(vmdef, cpu)) {
+ virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("cpu already exists"));
+ return -1;
+ }
+
+ if (virDomainCPUInsert(vmdef, cpu) < 0)
+ return -1;
+
+ return 0;
+}
+
+int qemuDomainAttachCPUDevice(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ virDomainCPUDefPtr cpu)
+{
+ int ret = -1;
+ char *devstr = NULL;
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+ virDomainDefPtr vmdef = vm->def;
+
+ if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
+ virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("qemu does not support -device"));
+ goto cleanup;;
+ }
+
+ if (qemuAssignDeviceCPUAlias(vmdef, cpu, -1) < 0)
+ goto cleanup;
+
+ if (qemuBuildCPUDeviceStr(&devstr, cpu, priv->qemuCaps) < 0)
+ goto cleanup;
+
+ if (qemuDomainCPUInsert(vmdef, cpu) < 0)
+ goto cleanup;
+
+ qemuDomainObjEnterMonitor(driver, vm);
+ if (devstr && qemuMonitorAddDevice(priv->mon, devstr) < 0) {
+ qemuDomainObjExitMonitor(driver, vm);
+ goto cleanup;
+ }
+ qemuDomainObjExitMonitor(driver, vm);
+
+ ignore_value(virBitmapSetBit(vm->def->apic_id_map, cpu->apic_id));
+ ret = 0;
+
+ cleanup:
+ VIR_FREE(devstr);
+ return ret;
+}
+
static int
qemuDomainAttachHostUSBDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h
index 19ab9a0..6cdead3 100644
--- a/src/qemu/qemu_hotplug.h
+++ b/src/qemu/qemu_hotplug.h
@@ -106,6 +106,13 @@ qemuDomainChrInsert(virDomainDefPtr vmdef,
virDomainChrDefPtr
qemuDomainChrRemove(virDomainDefPtr vmdef,
virDomainChrDefPtr chr);
+int
+qemuDomainAttachCPUDevice(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ virDomainCPUDefPtr cpu);
+int
+qemuDomainCPUInsert(virDomainDefPtr vmdef,
+ virDomainCPUDefPtr cpu);
int qemuDomainRemoveDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
--
1.9.3