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@xxxxxxxxxxxxxx> > --- > 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 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list