[libvirt] [RFC PATCH 0/3] qemu: add support to hot-unplug memory device

If you apply the patchset on your qemu [RESEND PATCH v1 00/13] QEmu memory hot unplug support. https://lists.nongnu.org/archive/html/qemu-devel/2015-01/msg00583.html, qemu can support memory hot-unplug. So this patchset will make libvirt support hot-unplug memory device for qemu driver. This series is based on the following patchset [RFC PATCH 00/11] qemu: add support to hotplug memory device. https://www.redhat.com/archives/libvir-list/2015-January/msg00728.html Zhu Guihua (3): qemu_monitor: introduce qemuMonitorDelMemoryBackend qemu: introduce qemuDomainRemoveDimmDevice qemu: implement dimm device hot-unplug on live level src/qemu/qemu_driver.c | 2 ++ src/qemu/qemu_hotplug.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_hotplug.h | 3 ++ src/qemu/qemu_monitor.c | 20 +++++++++++ src/qemu/qemu_monitor.h | 2 ++ 5 files changed, 122 insertions(+) -- 1.9.3

The function being introduced is responsibel for excuting 'object_del' command to hot remove memory backend. Signed-off-by: Zhu Guihua <zhugh.fnst@cn.fujitsu.com> --- src/qemu/qemu_monitor.c | 20 ++++++++++++++++++++ src/qemu/qemu_monitor.h | 2 ++ 2 files changed, 22 insertions(+) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 1db8ad0..c94a8d0 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -4219,6 +4219,26 @@ int qemuMonitorAddMemoryBackend(qemuMonitorPtr mon, return -1; } +int qemuMonitorDelMemoryBackend(qemuMonitorPtr mon, + const char *objID) +{ + VIR_DEBUG("mon=%p objID=%s", mon, objID); + + if (!mon) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("monitor must not be NULL")); + return -1; + } + + if (!mon->json) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("JSON monitor is required")); + return -1; + } + + return qemuMonitorDelObject(mon, objID); +} + int qemuMonitorAttachCharDev(qemuMonitorPtr mon, const char *chrID, virDomainChrSourceDefPtr chr) diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 9a69611..7f02627 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -866,6 +866,8 @@ int qemuMonitorGetTPMTypes(qemuMonitorPtr mon, int qemuMonitorAddMemoryBackend(qemuMonitorPtr mon, const char *objID, virDomainDimmDefPtr dimm); +int qemuMonitorDelMemoryBackend(qemuMonitorPtr mon, + const char *objID); int qemuMonitorAttachCharDev(qemuMonitorPtr mon, const char *chrID, -- 1.9.3

This func being introduced is responsible for deleting memory backend and removing dimm from VM def. Signed-off-by: Zhu Guihua <zhugh.fnst@cn.fujitsu.com> --- src/qemu/qemu_hotplug.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index b7ca41e..8a0594f 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -2931,6 +2931,44 @@ qemuDomainRemoveChrDevice(virQEMUDriverPtr driver, } +static int +qemuDomainRemoveDimmDevice(virQEMUDriverPtr driver, + virDomainObjPtr vm, + virDomainDimmDefPtr dimm) +{ + virObjectEventPtr event; + char *objAlias = NULL; + qemuDomainObjPrivatePtr priv = vm->privateData; + int ret = -1; + + VIR_DEBUG("Removing dimm device %s from domain %p %s", + dimm->info.alias, vm, vm->def->name); + + if (virAsprintf(&objAlias, "obj%s", dimm->info.alias) < 0) + goto cleanup; + + qemuDomainObjEnterMonitor(driver, vm); + if (qemuMonitorDelMemoryBackend(priv->mon, objAlias) < 0) { + qemuDomainObjExitMonitor(driver, vm); + goto cleanup; + } + qemuDomainObjExitMonitor(driver, vm); + + event = virDomainEventDeviceRemovedNewFromObj(vm, dimm->info.alias); + if (event) + qemuDomainEventQueue(driver, event); + + virDomainDimmRemove(vm->def, dimm); + virDomainDimmDefFree(dimm); + + ret = 0; + + cleanup: + VIR_FREE(objAlias); + return ret; +} + + int qemuDomainRemoveDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, @@ -2956,6 +2994,9 @@ qemuDomainRemoveDevice(virQEMUDriverPtr driver, break; case VIR_DOMAIN_DEVICE_DIMM: + qemuDomainRemoveDimmDevice(driver, vm, dev->data.dimm); + break; + case VIR_DOMAIN_DEVICE_NONE: case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_FS: -- 1.9.3

Signed-off-by: Zhu Guihua <zhugh.fnst@cn.fujitsu.com> --- src/qemu/qemu_driver.c | 2 ++ src/qemu/qemu_hotplug.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_hotplug.h | 3 +++ 3 files changed, 59 insertions(+) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 76ff7b5..61a4ead 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7074,6 +7074,8 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm, ret = qemuDomainDetachChrDevice(driver, vm, dev->data.chr); break; case VIR_DOMAIN_DEVICE_DIMM: + ret = qemuDomainDetachDimmDevice(driver, vm, dev->data.dimm); + break; case VIR_DOMAIN_DEVICE_FS: case VIR_DOMAIN_DEVICE_INPUT: case VIR_DOMAIN_DEVICE_SOUND: diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 8a0594f..4895f95 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -3897,3 +3897,57 @@ int qemuDomainDetachChrDevice(virQEMUDriverPtr driver, VIR_FREE(devstr); return ret; } + +int qemuDomainDetachDimmDevice(virQEMUDriverPtr driver, + virDomainObjPtr vm, + virDomainDimmDefPtr dimm) +{ + int ret = -1; + qemuDomainObjPrivatePtr priv = vm->privateData; + virDomainDefPtr vmdef = vm->def; + virDomainDimmDefPtr tmpDimm; + int rc; + + if (!(tmpDimm = virDomainDimmFind(vmdef, dimm))) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("device not present in domain configration")); + return ret; + } + + if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("qemu does not support -device")); + return ret; + } + + if (!tmpDimm->info.alias) { + virReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("detaching dimm device without alias name is not suported")); + return ret; + } + + qemuDomainMarkDeviceForRemoval(vm, &tmpDimm->info); + + qemuDomainObjEnterMonitor(driver, vm); + if (qemuMonitorDelDevice(priv->mon, tmpDimm->info.alias) < 0) { + qemuDomainObjExitMonitor(driver, vm); + goto cleanup; + } + qemuDomainObjExitMonitor(driver, vm); + + virDomainAuditMemory(vm, vm->def->mem.cur_balloon, + vm->def->mem.cur_balloon - tmpDimm->backend.size, + "update", true); + + ignore_value(virBitmapClearBit(vm->def->mem.dimm_slot_map, tmpDimm->slot)); + + rc = qemuDomainWaitForDeviceRemoval(vm); + if (rc == 0 || rc == 1) + ret = qemuDomainRemoveDimmDevice(driver, vm, tmpDimm); + else + goto cleanup; + + cleanup: + qemuDomainResetDeviceRemoval(vm); + return ret; +} diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h index 1e9f7b3..f47a849 100644 --- a/src/qemu/qemu_hotplug.h +++ b/src/qemu/qemu_hotplug.h @@ -98,6 +98,9 @@ int qemuDomainAttachChrDevice(virQEMUDriverPtr driver, int qemuDomainDetachChrDevice(virQEMUDriverPtr driver, virDomainObjPtr vm, virDomainChrDefPtr chr); +int qemuDomainDetachDimmDevice(virQEMUDriverPtr driver, + virDomainObjPtr vm, + virDomainDimmDefPtr dimm); int -- 1.9.3

On Wed, Jan 21, 2015 at 16:32:05 +0800, Zhu Guihua wrote:
If you apply the patchset on your qemu [RESEND PATCH v1 00/13] QEmu memory hot unplug support. https://lists.nongnu.org/archive/html/qemu-devel/2015-01/msg00583.html, qemu can support memory hot-unplug.
So this patchset will make libvirt support hot-unplug memory device for qemu driver.
This series is based on the following patchset [RFC PATCH 00/11] qemu: add support to hotplug memory device. https://www.redhat.com/archives/libvir-list/2015-January/msg00728.html
As with the hotplug series. I'm already working on incorporating this in a better way, thus I won't review this series in detail nor merge it. Peter
participants (2)
-
Peter Krempa
-
Zhu Guihua