[libvirt] [PATCH 3/5] setmem: implement the code to address the new API in the qemu driver
Daniel P. Berrange
berrange at redhat.com
Wed Mar 9 15:57:18 UTC 2011
On Wed, Mar 02, 2011 at 05:13:09PM +0900, Taku Izumi wrote:
> This patch implements the code to address the new API
> in the qemu driver.
>
>
> Signed-off-by: Taku Izumi <izumi.taku at jp.fujitsu.com>
> ---
> src/qemu/qemu_driver.c | 64 +++++++++++++++++++++++++++++++++++++++----------
> 1 file changed, 51 insertions(+), 13 deletions(-)
>
> Index: libvirt-git/src/qemu/qemu_driver.c
> ===================================================================
> --- libvirt-git.orig/src/qemu/qemu_driver.c
> +++ libvirt-git/src/qemu/qemu_driver.c
> @@ -1569,12 +1569,22 @@ cleanup:
> return ret;
> }
>
> -static int qemudDomainSetMemory(virDomainPtr dom, unsigned long newmem) {
> +static int qemudDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem,
> + unsigned int flags) {
> struct qemud_driver *driver = dom->conn->privateData;
> qemuDomainObjPrivatePtr priv;
> virDomainObjPtr vm;
> + virDomainDefPtr persistentDef;
> int ret = -1, r;
>
> + virCheckFlags(VIR_DOMAIN_MEM_LIVE |
> + VIR_DOMAIN_MEM_CONFIG, -1);
> +
> + if ((flags & (VIR_DOMAIN_MEM_LIVE | VIR_DOMAIN_MEM_CONFIG)) == 0) {
> + qemuReportError(VIR_ERR_INVALID_ARG,
> + _("invalid flag combination: (0x%x)"), flags);
> + }
I think you forgot a 'return -1' statement just here.
> +
> qemuDriverLock(driver);
> vm = virDomainFindByUUID(&driver->domains, dom->uuid);
> qemuDriverUnlock(driver);
> @@ -1595,27 +1605,51 @@ static int qemudDomainSetMemory(virDomai
> if (qemuDomainObjBeginJob(vm) < 0)
> goto cleanup;
>
> - if (!virDomainObjIsActive(vm)) {
> + if (!virDomainObjIsActive(vm) && (flags & VIR_DOMAIN_MEM_LIVE)) {
> qemuReportError(VIR_ERR_OPERATION_INVALID,
> "%s", _("domain is not running"));
> goto endjob;
> }
>
> - priv = vm->privateData;
> - qemuDomainObjEnterMonitor(vm);
> - r = qemuMonitorSetBalloon(priv->mon, newmem);
> - qemuDomainObjExitMonitor(vm);
> - if (r < 0)
> + if (!vm->persistent && (flags & VIR_DOMAIN_MEM_CONFIG)) {
> + qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
> + _("cannot change persistent config of a transient domain"));
> goto endjob;
> + }
>
> - /* Lack of balloon support is a fatal error */
> - if (r == 0) {
> - qemuReportError(VIR_ERR_OPERATION_INVALID,
> - "%s", _("cannot set memory of an active domain"));
> + if (!(persistentDef = virDomainObjGetPersistentDef(driver->caps, vm)))
> goto endjob;
> +
> + switch (flags) {
> + case VIR_DOMAIN_MEM_CONFIG:
> + persistentDef->mem.cur_balloon = newmem;
> + ret = 0;
> + break;
> +
> + case VIR_DOMAIN_MEM_LIVE:
> + case VIR_DOMAIN_MEM_LIVE | VIR_DOMAIN_MEM_CONFIG:
> + priv = vm->privateData;
> + qemuDomainObjEnterMonitor(vm);
> + r = qemuMonitorSetBalloon(priv->mon, newmem);
> + qemuDomainObjExitMonitor(vm);
> + if (r < 0)
> + goto endjob;
> + /* Lack of balloon support is a fatal error */
> + if (r == 0) {
> + qemuReportError(VIR_ERR_OPERATION_INVALID,
> + "%s", _("cannot set memory of an active domain"));
> + goto endjob;
> + }
> + if (flags & VIR_DOMAIN_MEM_CONFIG)
> + persistentDef->mem.cur_balloon = newmem;
> + ret = 0;
> + break;
> }
I think it is a little wierd to use a 'switch' statement
for processing this. I'd just have a pair of 'if' statements
eg
if (flags & VIR_DOMAIN_MEM_LIVE) {
.....do monitor stuff....
}
if (flags & VIR_DOMAIN_MEM_CONFIG) {
persistentDef->mem.cur_balloon = newmem;
ret = virDomainSaveConfig(driver->configDir, persistentDef);
}
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list